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

Write different hex-values in Python2 and Python3

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

print('\xfe')

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

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

这里出了什么问题?如何使用 Python3.

接收所需的输出 FE 0A

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

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

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

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

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

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

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

while 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?