在Python中将UTF-8字符串转换为CP950编码

0 投票
2 回答
3866 浏览
提问于 2025-04-17 13:43

我正在处理一个编码的问题。我的输入是一个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 字符串的问题。

撰写回答