在Python中将UTF-8字符串转换为CP950编码
我正在处理一个编码的问题。我的输入是一个unicode字符串,比如:
>>> s
u'\xa6\xe8\xac\xc9'
其实它是用cp950编码的。我想把它解码一下:(注意这里没有"u")
>>> print unicode('\xa6\xe8\xac\xc9', 'cp950')
西界
不过,我不知道怎么去掉那个"u"。直接转换不行:
>>> str(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
使用encode()得到的结果不是我想要的:
>>> s.encode('utf8')
'\xc2\xa6\xc3\xa8\xc2\xac\xc3\x89'
我想要的是'\xa6\xe8\xac\xc9'
2 个回答
0
我们先搞清楚:你有一串字节,这些字节是以Unicode编码读取的,但你希望它们被当作cp950编码来理解,对吗?
>>> ''.join(chr(ord(c)) for c in s)
'\xa6\xe8\xac\xc9'
>>> print ''.join(chr(ord(c)) for c in s).decode('cp950')
西界
2
这段话有点儿不太规范地使用了 unicode
类型。在 unicode
字符串中,字符应该是 Unicode 码点(比如 u'\u897f\u754c'
),所以它们和编码无关。也就是说,这些字符不应该是某种特定编码下的字节(在 Python 3 中,这一点区分得很清楚,Unicode 字符串用 str
表示,而字节字符串用 bytes
表示)。
既然你想把每个码点当作字节来处理,你可以这样做:
u'\xa6\xe8\xac\xc9'.encode('iso-8859-1')
因为 Unicode 的前 256 个码点被定义为和 ISO-8859-1 的码点相同。不过,请尽量去解决导致你最开始得到这个错误的 Unicode 字符串的问题。