在 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)
。 file
是 print()
的可选参数,默认为 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?
我目前正在将 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)
。 file
是 print()
的可选参数,默认为 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?