编码的烦恼
做开发的朋友都会碰到各种各样的编码问题,一不小心就是各种乱码。
我在「如何让你的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 encodings
import chardet
def 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/