2011年7月17日星期日

猜猜猜,猜编码~

小说也好、歌词字幕也好,中文的就有个编码问题……在 N72 上弄过个 python 脚本,用了 http://www.linuxsir.org/bbs/showthread.php?t=215906 花花的代码,常见的几种编码挨个试,处理的也挺好—— chardet 在 N72 上超~慢的,我也碰不上什么特别变态的编码,不用它。移植到 N900 上时处理目录的部分很开心的丢掉了 os.path.walk ,用上了可爱的 os.walk ~终于不用继续苦逼地困守 python 2.2 了~感动啊~
今天测试脚本的时候忘记加参数,把当前目录也就是 /home/user 下面所有的 txt 文件都转成 utf-8 了……既来之则安之,检查一下有没有转错,于是问题来了~ dosbox 里轩辕剑二的 readme.txt 文件显然是 big5 码的,但是被当成 gb18030 转码了——好吧,那堆乱码竟然还都是合法字符?!囧。之前本来是用 gbk 的,碰到个特殊符号搞不定,改成 gb18030 就过了,没想到合法字符太多也有问题。把 gb18030 改回 gbk 的话就不会误判,但是也无法解码。单独拎出来指定从 big5 转,报错 UnicodeDecodeError: 'big5' codec can't decode bytes in position 3-4: illegal multibyte sequence 。用 leafpad 打开,发现那个位置是个表格符号╔
查到 decode 还有第二个参数,用 str.decode("big5", "ignore") 可以把文件转出来,不过所有的表格符号都消失了。
google " python decode big5 ",在 http://stackoverflow.com/questions/4731684/chardet-apparently-wrong-on-big5 看到了关键字 big5_hkscs 。试了一下 str.decode("big5_hkscs") ,果然对了~内牛满面。
hkscs 的介绍: http://zh.wikipedia.org/wiki/香港增補字符集 。 hkscs 和 big5 的关系大致类似 gb2312 和 gbk ……不过因为先天缺陷反倒是有希望早点退出历史,好事啊~
参考 http://www.cublog.cn/u/9465/showart_433803.html ,我目前的猜编码的顺序是 ("utf-16", "utf-8", "gbk", "big5hkscs", "euc_jp", "euc_kr", "gb18030") ,怎么解码都不会出错的 latin1 就免了吧~

笔记一下, python 能否解特定的编码可以用 codecs.lookup(编码名) 试试。所有支持的编码可以在 /usr/lib/python2.5/encodings/aliases.py 里看到……各种马甲有木有!!!

update 20110718: 测试发现 python 里把 uft-16 放前面会把一些 utf-8 的文件误判成 utf-16 的。所以把猜编码的顺序改成 ("utf-8", "gbk", "big5hkscs", "euc_jp", "euc_kr", "gb18030", "utf-16") 了。等哪天出了 bug 再调整吧~
--

没有评论:

发表评论