查看原文
其他

编码的烦恼

alitrack alitrack 2022-10-01

做开发的朋友都会碰到各种各样的编码问题,一不小心就是各种乱码。

我在「如何让你的Python应用程序分发变得很容易?」绍到的q(一款直接写SQL查询CSV或者TSV的小工具),它读入CSV的时候默认UTF-8,如果不是,需要你指定编码,如果可以让q自动判断编码(或者有工具帮我们判断),是不是可以省事很多?

我在做项目的时候,有个客户把数据从数据库导出CSV传给了我们,我们在读入后,发现结果串行了,经研究发现,是因为乱码(汉字出现了截断,具体原因是客户的数据库编码使用了ISO-8859-1,加之长度设置不够,碰到中英文混合输入,并且结尾为中文的时候,就可能出现只保留某个汉字一半字节的情况),最后使用iconv过滤掉无法识别的字符,至于缺失的字符,也没有办法了(数据库里就已经发生了缺失)。


下面我介绍几个Python下和编码有关的包,希望能对解决编码对问题起到帮助。

Chardet: 统一字符编码侦测

支持以下编码的检测,

  • ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)

  • Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (繁体和简体中文)

  • EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (日语)

  • EUC-KR, ISO-2022-KR (韩语)

  • KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (西里尔语)

  • ISO-8859-5, windows-1251 (保加利亚语)

  • ISO-8859-1, windows-1252 (西欧语言)

  • ISO-8859-7, windows-1253 (希腊语)

  • ISO-8859-8, windows-1255 (视觉和逻辑希伯来语)

  • TIS-620 (泰文)

比如使用Chardet封装一个encoding_detect 函数:

# import a library to detect encodingsimport chardetdef encoding_detect(filename): """ get file's encoding """ with open(filename, 'rb') as rawdata: segment=rawdata.read(1024) result = chardet.detect(segment) return result['encoding']

这个代码不是很严谨,没有考虑到confidence。

如果没有你想要的语言支持,你可以考虑Linux命令file,或者


python-magic,libmagic封装

Linux系统下知名的file就是使用了这个魔法库

因为依赖libmagic,所以不同系统下会有额外的安装操作,Linux和MacOS可以借助conda来简化安装,Windows需要自行下载libmagic。

具体安装使用可以访问https://github.com/ahupp/python-magic


langdetect,自动语言侦测神器

使用Google Translate(谷歌翻译)的时候会留意到它有一个自动判断语言的选项,当你不知道要翻译的是什么语言的时候,你可以选择它,

langdetect就是实现了这样一个功能,它是基于Google的的language-detection(java版本)移植而来。

langdetect 开箱支持55 语言 (ISO 639-1 codes):

af, ar, bg, bn, ca, cs, cy, da, de, el, en, es, et, fa, fi, fr, gu, he,hi, hr, hu, id, it, ja, kn, ko, lt, lv, mk, ml, mr, ne, nl, no, pa, pl,pt, ro, ru, sk, sl, so, sq, sv, sw, ta, te, th, tl, tr, uk, ur, vi, zh-cn, zh-tw


iconv

这个工具可以方便地进行各种编码之间的转换

这个工具同时还有一个非常重要的功能,就是在转换时自动忽略目标转换编码无法识别的字符,可以用于处理某些数据库因为编码设置问题,导致做字节文字被截断的情况(使用参数-c)。

我曾用这个工具VtigerCRM(知名开源CRM,使用PHP开发)台湾Big5码语言包转为GBK,再经润色加工。

链接:

  • https://github.com/Mimino666/langdetect

  • https://www.slideshare.net/shuyo/language-detection-library-for-java

  • https://github.com/ahupp/python-magic

  • https://pypi.org/project/iconv/


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存