我是靠谱客的博主 欢呼玫瑰,最近开发中收集的这篇文章主要介绍python:pymssql查询结果集合中部分中文乱码处理python:pymssql查询结果中文乱码处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

python:pymssql查询结果中文乱码处理

1、背景描述

有个任务是用python去sqlserver捞数据(数据库连接编码是utf8),用到了多库多表查询,然后有部分返回值是写死的,就像这样select "人名币" as "币种",然后又因为两个库的编码格式不一样,最后导致,查出来的数据,部分乱码,乱码不是那种16进制的,比如这样bxe4xb8xad而是这种的中文乱码,就像这样æ:°×ÁÖ¡¢±»,好了,这是背景。

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.

最后

以上就是欢呼玫瑰为你收集整理的python:pymssql查询结果集合中部分中文乱码处理python:pymssql查询结果中文乱码处理的全部内容,希望文章能够帮你解决python:pymssql查询结果集合中部分中文乱码处理python:pymssql查询结果中文乱码处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部