我目前正在将Python2脚本移植到Python3,并且遇到此问题:
print('\xfe')
当我使用Python2 python test.py > test.out
运行它时,文件由十六进制值FE 0A
组成,与预期的一样。
但是当我使用Python3 python3 test.py > test.out
运行它时,该文件由十六进制值C3 BE 0A
组成。
这里出了什么问题?如何使用Python3接收所需的输出FE 0A
。
答案 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)
。 file
是print()
的可选参数,默认为sys.stdout
。这意味着您应该能够对sys.stdout.write(str(argument) + '\n')
执行相同的操作。因此,结果取决于您可以从sys.stdout.encoding
获得的已使用编码。如果您传递另一个file
参数,则必须打开文件对象以便在文本模式下进行写入,并且可能会应用不同的编码。