python unicode:什么编解码器将保留文字字节值?

时间:2016-05-02 18:56:51

标签: python unicode encoding

我需要将字节字符串解码为unicode,并将其插入到unicode字符串(python 2.7)中。当我稍后将该unicode字符串编码回字节时,字节数组必须等于原始字节。我的问题是我应该使用哪种编码来实现这一目标。

示例:

#every possible byte
byteString = b"".join([chr(ii) for ii in xrange(256)])
unicodeString = u"{0}".format(byteString.decode("ascii"))
backToBytes = unicodeString.encode("ascii")
assert byteString==backToBytes

这与臭名昭着的失败了:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 128: ordinal not in range(128)

我应该使用哪种编码(而不是'ascii')来保存我的字节值?

我在这个(目前已损坏的)示例中使用“ascii”,因为它是我的默认编码:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

1 个答案:

答案 0 :(得分:1)

事实证明,'latin1'(又名'iso-8859-1')编码将逐字地保留每个字节。 This link提到了这一事实,尽管other sources让我相信这是错误的。我可以确认在python 2.7上运行此代码是有效的,证明'iso-8859-1'确实保留了每个可能的字节:

#every possible byte
byteString = b"".join([chr(ii) for ii in xrange(256)])
unicodeString = u"{0}".format(byteString.decode("iso-8859-1"))
backToBytes = unicodeString.encode("iso-8859-1")
assert byteString==backToBytes