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

Q.E.D.

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水豚少年的码农生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值