关于在 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。

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

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

Advertisements

Tags: , , , ,

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

  1. Gris Ge Says:

    给予你的python脚本,我写了个perl 一行版的。共享。

    ls * | perl -ne ‘use Encode qw/decode encode/; print encode(‘utf8’, decode(‘gbk’,decode(“utf8”, $_)))’

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


%d bloggers like this: