簡體   English   中英

在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對象。

在Python 3中,字符串是(Unicode)字符的序列。 因此,代碼'\\xfe'是一個包含一個字符的字符串。 當您打印字符串時,必須將其編碼為字節。 由於您的環境選擇了UTF-8的默認編碼,因此已對其進行了相應的編碼。

如何解決這個問題取決於您的數據。 是字節還是字符? 如果是字節,則更改代碼以告知解釋器: print(b'\\xfe') 如果它是字符,但是您想要不同的編碼,則對字符串進行相應的編碼: print( '\\xfe'.encode('latin1') )

print '\\xfe' 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),加密數據,請參閱如何在不知道編碼的情況下在Python 3中將字節寫入文件中?

print(argument)使用str() print(argument)轉換參數(如果需要),然后調用file.write(string) fileprint()的可選參數,默認為sys.stdout 這意味着您應該能夠使用sys.stdout.write(str(argument) + '\\n') 因此,結果取決於您可以從sys.stdout.encoding獲得的編碼。 如果傳遞另一個file參數,則必須打開該文件對象以在文本模式下進行寫入,並且可能會應用其他編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM