V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
CR7sun
V2EX  ›  Python

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

  •  
  •   CR7sun · 2019-08-07 10:25:55 +08:00 · 2522 次点击
    这是一个创建于 1964 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我写了一个发短信的小工具,只要输入发送内容和手机号码就会自动发送短信,当我输入的内容是英文时没有任何问题,但当我输入中文时,检查出来的编码竟然是 {'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
    mywaiting
        1
    mywaiting  
       2019-08-07 10:33:06 +08:00
    字符串编码的问题?将 python, mysql client, mysql charset, mysql table charset 等这些统一为 utf8mb4 试试看
    11ssss
        2
    11ssss  
       2019-08-07 13:41:56 +08:00
    字符编码的问题
    bertsir
        3
    bertsir  
       2019-08-07 13:56:48 +08:00
    为啥不用 utf8
    zqjilove
        4
    zqjilove  
       2019-08-07 13:59:01 +08:00
    1 楼正解吧,之前也碰到过
    mrchi
        5
    mrchi  
       2019-08-07 14:10:32 +08:00
    python 用 python3,指定用 utf8 编码;
    mysql 用 utf8mb4,mysql 的 utf8 是个坑。

    @mywaiting Python 哪有 utf8mb4 的编码?
    Destiny97
        6
    Destiny97  
       2019-08-07 14:22:59 +08:00 via Android
    短信的编码好像有点特殊,有可能是这个问题
    mywaiting
        7
    mywaiting  
       2019-08-07 15:16:48 +08:00
    @mrchi 意思是这样,看得懂可以了
    CR7sun
        8
    CR7sun  
    OP
       2019-08-07 16:08:46 +08:00
    @Destiny97 这里面短信内容应该是必须 GBK 编码,但是短信内容编码感觉怎么都转不到 GBK 一执行插入操作就显示 UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 181: invalid start byte
    CR7sun
        9
    CR7sun  
    OP
       2019-08-07 16:12:33 +08:00
    @mywaiting 我不能改数据库啊,而且我连的是 sqlserver2000。。。。
    mrchi
        10
    mrchi  
       2019-08-07 17:04:27 +08:00 via iPhone
    @CR7sun 所以是存库用 gbk 吗
    CR7sun
        11
    CR7sun  
    OP
       2019-08-07 17:23:52 +08:00
    @mrchi 数据库都是 chinese_PRC_CI_AS 这种编码,然后插入语句只要短信内容部分是 GBK 编码就行了,不知道为什么总是插入出错,print 打印出来的语句在数据库里都是可以正常执行的。。。
    mrchi
        12
    mrchi  
       2019-08-07 17:56:32 +08:00
    去掉这一行,word=word.decode("KOI8-R"),
    word=word.encode("gbk") 这一行用 word=word.encode("utf8") 试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1267 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:00 · PVG 08:00 · LAX 16:00 · JFK 19:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.