Administrator
发布于 2020-10-31 / 1205 阅读 / 0 评论 / 0 点赞

python:pymssql查询结果集合中部分中文乱码处理

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’)
  • 配合异常捕获

评论