如何将字符串从CP-1251转换为UTF-8?

28 投票
6 回答
79737 浏览
提问于 2025-04-17 03:06

我正在使用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')

撰写回答