在Python2和Python3中编写不同的十六进制值

时间:2015-08-14 19:25:50

标签: python string python-3.x porting hexdump

我目前正在将Python2脚本移植到Python3,并且遇到此问题:

print('\xfe')

当我使用Python2 python test.py > test.out运行它时,文件由十六进制值FE 0A组成,与预期的一样。

但是当我使用Python3 python3 test.py > test.out运行它时,该文件由十六进制值C3 BE 0A组成。

这里出了什么问题?如何使用Python3接收所需的输出FE 0A

3 个答案:

答案 0 :(得分:3)

字节序列C3 BE是字符U+00FE的UTF-8编码表示。

Python 2将字符串作为字节序列而不是字符处理。所以'\xfe'是一个包含一个字节的str对象。

在Python 3中,字符串是(Unicode)字符的序列。所以代码'\xfe'是一个包含一个字符的字符串。打印字符串时,必须将其编码为字节。由于您的环境选择了UTF-8的默认编码,因此对其进行了相应编码。

如何解决这个问题取决于您的数据。是字节还是字符?如果是bytes,则更改代码以告诉解释器:print(b'\xfe')。如果是字符,但您想要不同的编码,则相应地对字符串进行编码:print( '\xfe'.encode('latin1') )

答案 1 :(得分:3)

print '\xfe' Python 2代码与此Python 3代码大致相同:

sys.stdout.buffer.write(b'\xfe' + os.linesep.encode())

print('\xfe') Python 3代码大致相当于这个Python 3代码:

sys.stdout.buffer.write((u'\xfe' + os.linesep).encode(sys.stdout.encoding))

在第一种情况下,Python打印字节。在第二种情况下,它打印Unicode,结果取决于您的环境(语言环境)。

>>> u'\xfe'.encode('utf-8')
b'\xc3\xbe'

要打印文本,请始终在Python中使用Unicode。不要对脚本中当前环境使用的字符编码进行硬编码。

要打印二进制数据,如图像数据,压缩数据(gzip),加密数据,请参阅How to write bytes to a file in Python 3 without knowing the encoding?

答案 2 :(得分:1)

print(argument)使用str()转换参数(如果需要),然后调用file.write(string)fileprint()的可选参数,默认为sys.stdout。这意味着您应该能够对sys.stdout.write(str(argument) + '\n')执行相同的操作。因此,结果取决于您可以从sys.stdout.encoding获得的已使用编码。如果您传递另一个file参数,则必须打开文件对象以便在文本模式下进行写入,并且可能会应用不同的编码。