python:pymssql查询结果中文乱码处理
1、背景描述
有个任务是用python去sqlserver捞数据(数据库连接编码是utf8),用到了多库多表查询,然后有部分返回值是写死的,就像这样
select "人名币" as "币种"
,然后又因为两个库的编码格式不一样,最后导致,查出来的数据,部分乱码,乱码不是那种16进制的,比如这样b\xe4\xb8\xad
,而是这种的真中文乱码,就像这样æ:°×ÁÖ¡¢±»
,好了,这是背景。
2、乱码原因
- 多库多表查询,然后有部分返回值是写死的,就像这样
select "人名币" as "币种"
- 两个库的编码格式不一样
3、我的问题和其他博客的对比
- 从百度找到了google,最终得出的解决方案是这样的。
乱码的地方加上.encode(‘latin1’).decode(‘gbk’)
,先编码成SQL server支持的编码格式,再解码成中文。
- 大概是这样的用法
"æ:°×ÁÖ¡¢±»".encode(‘latin1’).decode(‘gbk’)
这样就会输出中文了。
- 但是
- 但是
- 但是
- 我的是一个集合,集合里面而且是部分这种的乱码,其他的格式有数字,有时间,有其他正确的中文。这种循环集合然后编码,会出现报错,总之就是会遇到无法编码的情况。
4、我的解决方案
.encode(‘latin1’)等价于.encode(‘l1’)
- 先贴代码
@staticmethod
def cn_garbled_code(resList):
"""
数据库返回中文乱码问题解决,进来一个list进行处理
"""
target_list = []
target_index = 0
for item in resList:
target_list.insert(target_index,list(item))
target_index+=1
for item in target_list:
for item1 in item:
if type(item1) is str:
try:
if(chardet.detect(item1.encode('l1'))['encoding'] != 'ascii'):
# print(item1.encode('l1').decode("GBK"))
item_index = target_list.index(item)
item1_index = item.index(item1)
target_list[item_index][item1_index] = item1.encode("l1").decode("GBK")
except UnicodeEncodeError:
# print("不用编码")
pass
return target_list
- 核心代码
try:
if(chardet.detect(item1.encode('l1'))['encoding'] != 'ascii'):
# print(item1.encode('l1').decode("GBK"))
item_index = target_list.index(item)
item1_index = item.index(item1)
target_list[item_index][item1_index] = item1.encode("l1").decode("GBK")
except UnicodeEncodeError:
# print("不用编码")
pass
- 配合异常捕获
如果遇到无法编码的异常,就跳过,继续循环下去.
5、总结
- .encode(‘latin1’).decode(‘gbk’)
- .encode(‘latin1’)等价于.encode(‘l1’)
- 配合异常捕获