首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

我写了一个发短信的小工具,每次进行数据库插入操作时都会显示如下错误

  •  
  •   CR7sun · 44 天前 · 1434 次点击
    这是一个创建于 44 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我写了一个发短信的小工具,只要输入发送内容和手机号码就会自动发送短信,当我输入的内容是英文时没有任何问题,但当我输入中文时,检查出来的编码竟然是 {'confidence': 0.38398486178080915, 'language': 'Russian', 'encoding': 'KOI8-R'} 然后插入数据库操作也会报错 UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 181: invalid start byte,输出详细错误是('Error:', UnicodeDecodeError('utf8', "insert into sms_wait_for_send (orgaddr,destaddr,sendtime,validtime,msgtext,serviceid,feecode,feetype,sendstatus,msgfmt,code_3) select '106583187',13888888888,1565142615,1565178615,'\xb2\xe2\xca\xd4','MF','0','01',1,8,'broadcast' ", 181, 182, 'invalid start byte')),中文的编码变成了这个,请问这该怎么解决啊。

    # -*- coding:utf-8 -*-
    
    import json,pyodbc,time,sys,chardet
    
    reload(sys)
    sys.setdefaultencoding ('utf-8')
    
    conn=pyodbc.connect('DRIVER={SQL Server Native Client 10.0};SERVER=XXX;DATABASE=XXX;UID=XXX;PWD=XXX')
    cursor = conn.cursor()
    stopword = ''
    str1 = ''
    values=''
    word=raw_input("Text:")
    word=word.decode("KOI8-R")
    word=word.encode("gbk")
    print chardet.detect(word)
    print word
    print('PhoneNumber:')
    for line in iter(raw_input, stopword):
      str1 += line + '\n'
      now = int(time.time())
      future=now+36000
      values=values+'select'+' '+"'106583187'"+','+line+','+str(now)+','+str(future)+','+"'"+word+"'"+','+"'MF'"+','+"'0'"+','+"'01'"+','+str(1)+','+str(8)+','+"'broadcast'"+' union all '
    values1="insert into sms_wait_for_send (orgaddr,destaddr,sendtime,validtime,msgtext,serviceid,feecode,feetype,sendstatus,msgfmt,code_3) "+values
    values2=values1[:-10]
    print values2
    s=cursor.execute(values2)
    if (s==1):
        print "Success!"
    else:
        print "Fail!"
    conn.close()
    
    12 回复  |  直到 2019-08-07 17:56:32 +08:00
        1
    mywaiting   44 天前
    字符串编码的问题?将 python, mysql client, mysql charset, mysql table charset 等这些统一为 utf8mb4 试试看
        2
    11ssss   44 天前
    字符编码的问题
        3
    bertsir   44 天前
    为啥不用 utf8
        4
    zqjilove   44 天前
    1 楼正解吧,之前也碰到过
        5
    mrchi   44 天前
    python 用 python3,指定用 utf8 编码;
    mysql 用 utf8mb4,mysql 的 utf8 是个坑。

    @mywaiting Python 哪有 utf8mb4 的编码?
        6
    Destiny97   44 天前 via Android
    短信的编码好像有点特殊,有可能是这个问题
        7
    mywaiting   44 天前
    @mrchi 意思是这样,看得懂可以了
        8
    CR7sun   44 天前
    @Destiny97 这里面短信内容应该是必须 GBK 编码,但是短信内容编码感觉怎么都转不到 GBK 一执行插入操作就显示 UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 181: invalid start byte
        9
    CR7sun   44 天前
    @mywaiting 我不能改数据库啊,而且我连的是 sqlserver2000。。。。
        10
    mrchi   44 天前 via iPhone
    @CR7sun 所以是存库用 gbk 吗
        11
    CR7sun   44 天前
    @mrchi 数据库都是 chinese_PRC_CI_AS 这种编码,然后插入语句只要短信内容部分是 GBK 编码就行了,不知道为什么总是插入出错,print 打印出来的语句在数据库里都是可以正常执行的。。。
        12
    mrchi   44 天前
    去掉这一行,word=word.decode("KOI8-R"),
    word=word.encode("gbk") 这一行用 word=word.encode("utf8") 试试
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2665 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 10:42 · PVG 18:42 · LAX 03:42 · JFK 06:42
    ♥ Do have faith in what you're doing.