如何将字符串从CP-1251转换为UTF-8?
我正在使用mutagen这个工具,把ID3标签的数据从CP-1251/CP-1252格式转换成UTF-8。在Linux系统上没有问题。但是在Windows上,当我在wx.TextCtrl上调用SetValue()
时,出现了一个错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
我从mutagen获取的原始字符串(假设是CP-1251编码)是:
u'\xc1\xe5\xeb\xe0\xff \xff\xe1\xeb\xfb\xed\xff \xe3\xf0\xee\xec\xf3'
我尝试把它转换成UTF-8:
dd = d.decode('utf-8')
...甚至还把默认编码从ASCII改成UTF-8:
sys.setdefaultencoding('utf-8')
...但还是遇到同样的错误。
6 个回答
4
如果 d
是一个正确的Unicode字符串,那么 d.encode('utf-8')
会把它转换成UTF-8格式的字节串。不要通过打印来测试这个结果,因为可能会因为编码的问题而显示不正常。
5
你的字符串 d
是一个 Unicode 字符串,而不是 UTF-8 编码的字符串!所以你不能用 decode()
来处理它,你必须用 encode()
将它转换成 UTF-8 或者你需要的其他编码格式。
>>> d = u'\xc1\xe5\xeb\xe0\xff \xff\xe1\xeb\xfb\xed\xff \xe3\xf0\xee\xec\xf3'
>>> d
u'\xc1\xe5\xeb\xe0\xff \xff\xe1\xeb\xfb\xed\xff \xe3\xf0\xee\xec\xf3'
>>> print d
Áåëàÿ ÿáëûíÿ ãðîìó
>>> a.encode("utf-8")
'\xc3\x81\xc3\xa5\xc3\xab\xc3\xa0\xc3\xbf \xc3\xbf\xc3\xa1\xc3\xab\xc3\xbb\xc3\xad\xc3\xbf \xc3\xa3\xc3\xb0\xc3\xae\xc3\xac\xc3\xb3'
(这通常是在所有处理完成后,最后一步你需要把它保存为 UTF-8 编码的文件时进行的操作,比如说)。
如果你的输入是其他编码格式,那么处理方式就反过来了:
>>> d = "Schoßhündchen" # native encoding: cp850
>>> d = "Schoßhündchen".decode("cp850") # decode from Windows codepage
>>> d # into a Unicode string (now work with this!)
u'Scho\xdfh\xfcndchen'
>>> print d # it displays correctly if your shell knows the glyphs
Schoßhündchen
>>> d.encode("utf-8") # before output, convert to UTF-8
'Scho\xc3\x9fh\xc3\xbcndchen'
32
如果你确定你的输入是使用cp1251编码的,你可以这样做:
d.decode('cp1251').encode('utf8')