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

2019-08-07 10:25:55 +08:00
 CR7sun

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

@mywaiting Python 哪有 utf8mb4 的编码?
Destiny97
2019-08-07 14:22:59 +08:00
短信的编码好像有点特殊,有可能是这个问题
mywaiting
2019-08-07 15:16:48 +08:00
@mrchi 意思是这样,看得懂可以了
CR7sun
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
2019-08-07 16:12:33 +08:00
@mywaiting 我不能改数据库啊,而且我连的是 sqlserver2000。。。。
mrchi
2019-08-07 17:04:27 +08:00
@CR7sun 所以是存库用 gbk 吗
CR7sun
2019-08-07 17:23:52 +08:00
@mrchi 数据库都是 chinese_PRC_CI_AS 这种编码,然后插入语句只要短信内容部分是 GBK 编码就行了,不知道为什么总是插入出错,print 打印出来的语句在数据库里都是可以正常执行的。。。
mrchi
2019-08-07 17:56:32 +08:00
去掉这一行,word=word.decode("KOI8-R"),
word=word.encode("gbk") 这一行用 word=word.encode("utf8") 试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/589729

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX