Sunday, July 24, 2011

关于在 linux 下,用 chrome 下载迅雷离线文件乱码的问题

一扯到编码问题就很难说清楚。情况是这样的。迅雷的网页本身是用 UTF-8 编码的,所以在浏览器里显示正常。但是点击下载后,浏览器识别出的文件名却是这么一串:

> [ĸÇ×].Mother.mkv
>

如果在 python 里面 print 出来则是这么一段:

> '[xc3x84xc2xb8xc3x87xc3x97].Mother.mkv'

(原串是 '[母亲].Mother.mkv')。我的用户编码设置是 en_US.UTF-8,如果我设置为 zh_CN.GB18030,则能正确识别出该字串,但是不能保存该文件到硬盘,因为我的 hdd 都是用 UTF-8 编码的。所以猜测是,在 UTF-8 环境下,浏览器读入了 GBK 编码的字串,但是直接理解为了 unicode 的字串,并且直接把它们编码成了 UTF-8。

以'母'字为例,下面这幅图解释了问题所在:

http://iveney.files.wordpress.com/2011/07/image.png&h=297

所以,上面字串中,'xc3x84xc2xb8'对应了'母'字,而 'xc3x87xc3x97' 对应了'亲'字。
解决的方法就是把这个过程逆转过来做一次。我用 python 稍微写了一下,稍微有点繁琐,不知道能不能简化。
大致的思路就是,先把非ascii的字符匹配出来,然后每4个作为一个组(代表了一个 GBK 的字符),
然后decode 为 unicode code point。这时的 code point 的 *value* 实质上是 GBK 的字符编码,但因为它是一个 unicode object,因此必须把它转换为一个普通的 str。转换完后,就可以从 GBK decode 为 unicode 了。当然输出时,我们要再 encode 它为 UTF-8。
示例代码在这里 (https://gist.github.com/1101679) 。

No comments: