Tuesday, January 5, 2010

amule下载完的文件名乱码问题

最近使用amule的次数比较好, 发现amule像一个金矿, 里面太奶奶的多好货了.

当然, 也不是白取的, 从我notebook上upload的数据都有33G多了. 下载点也是正常的.

不过, 奶奶的, 今天在Incoming里找文件, 无法忍受amule下载的文件名是乱码一事~ 决定清理!

In [76]: f = os.listdir('.')

In [77]: for i in range(len(f)):
                   if f[i].startswith("LINUX"):
                           print i
Out[77]: 8
找出自己要试验的一条文件名

乱码, 一般都是gbk编码吧, 于是:
In [81]: print f[8].decode("gbk")
-------> print(f[8].decode("gbk"))
LINUX莽鲁禄莽禄聼莽庐隆莽聬聠忙聤聙忙聹炉忙聣聥氓聠聦茂录聢莽卢卢2莽聣聢茂录聣.pdf


顶~~~~~~ 屁都不是. 又试了几种编码都不行~~~~ 试多了几次, 发现一个现象:

In [87]: f[8].decode("utf-8")
Out[87]: u'LINUX\xe7\xb3\xbb\xe7\xbb\x9f\xe7\xae\xa1\xe7\x90\x86\xe6\x8a\x80\xe6\x9c\xaf\xe6\x89\x8b\xe5\x86\x8c\xef\xbc\x88\xe7\xac\xac2\xe7\x89\x88\xef\xbc\x89.pdf'

In [88]: print "\xe7\xb3\xbb"
-------> print("\xe7\xb3\xbb")


* 从上面取出的一段外码, 是可以正确显示的. 看来amule是把unicode的文件名直接给str()成raw string串了. 乱码就是这样产生的:

In [108]: c = u'梁'

In [109]: c
Out[109]: u'\xe6\xa2\x81'

In [110]: str(c)
Out[110]: '\xc3\xa6\xc2\xa2\xc2\x81'

In [111]: print str(c)
--------> print(str(c))
æ¢

现在的问题是怎么把上面一串为unicode的外码整成raw string呢?

现在的目标是把u'\xe7'转成'\xe7', 如下方法:
In [153]: chr(ord(u'\xe7'))
Out[153]: '\xe7'


OK, 妈的。 一个for处理完你~~~ 狗日的乱码

#!/usr/bin/env python
# coding: utf-8
import os

DIR="/home/jessinio/.aMule/Incoming"

for f in os.listdir( DIR ):
    print f
    retval = []
    for i in f.decode("utf-8"):
        # 文件名本身没有乱码的情况时, 会是unicode, 这时ord的值为unicode的内码, 超过256
        if ord(i) > 256:
            retval.append(i.encode("utf-8"))
        else:
            retval.append(chr(ord(i)))
    print ''.join(retval)
    os.rename( os.path.join(DIR, f), os.path.join( DIR, ''.join(retval) ) )


No comments:

Post a Comment

Note: Only a member of this blog may post a comment.