我需要将字节字符串解码为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'
答案 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