簡體   English   中英

decode('utf-16') 無法正確解碼

[英]decode('utf-16') does not decode correctly

我有 utf-16 字符串\У\к\р\а\и\н\а 這對Украина進行編碼,您可以使用任何在線 utf16 解碼器對其進行驗證。

但試圖在python中解碼它:

print(b"\u0423\u043a\u0440\u0430\u0438\u043d\u0430".decode('utf16'))

輸出:畜㐰㌲畜㐰愳畜㐰〴畜㐰〳畜㐰㠳畜㐰搳畜㐰〳

為什么?

這不是“utf-16”字符串,它只是一個常規的 unicode 轉義字符串。 print("\У\к\р\а\и\н\а")打印出正確的輸出,無需解碼任何內容。

但是,如果您出於某種原因實際上有一個帶有文字字節“\\”、“u”、“0”、“4”等的字節串,請使用print(b"\У\к\р\а\и\н\а".decode("unicode-escape"))

如果您有"\У\к\р\а\и\н\а" ,那么這不會“編碼” Украина 等於Украина 它不是“一個 utf-16 字符串”; 它是一個字符串 沒有“{name of encoding} 字符串”之類的東西

“使用”對字符串進行編碼的字節。 bytes對象不是文本。 字符串不是字節序列。 它們不是有意義的相關類型,而且似乎只是出於遺留原因(老實說,相對不幸的是;第一個 Unicode 標准在時間上比今天更接近第一個 ASCII 標准。)因此, bytes對象的字面語法,以及他們的規范repr ,是相當不幸的; 但這就是我們必須忍受的。

如果你有b"\У\к\р\а\и\н\а" ,那么你有一個bytes對象,使用文字創建。 bytes的文字語法沒有為\\u\u003c/code>轉義分配任何特定含義。 \\u\u003c/code> u Unicode。 在字符串中,該序列表示一個 Unicode 代碼點。 bytes對象不能包含那些——它們包含字節——所以它們沒有理由支持轉義序列。 像往常一樣,Python 用引號括起來的東西,一個反斜杠后面跟一個沒有特殊含義的東西,只是一個反斜杠(即使你通常應該加倍反斜杠來逃避它們)。 當然,在bytes中,反斜杠符號並不代表反斜杠文本字符,因為bytes對象不存儲文本。 相反,由於這些歷史原因,它代表整數值 92。

如果要創建一個bytes對象,其中包含表示 UTF-16 編碼字符串的字節,那么:

  • 確定您實際上是指 UTF-16-LE 還是 UTF-16-BE。 是需要選擇的。
  • 對於字符串的每個 Unicode 碼點,如果它在Basic Multilingual Plane中,則找到對應的 16 位值; 對於其他字符,使用兩個這樣的值的代理對
  • 對於每個 16 位值,將其表示為兩個字節,順序由所需的字節序(-LE 或 -BE)確定。
  • 對於這些字節中的每一個,使用帶有\\x轉義序列(反斜杠、小寫 x 和兩個十六進制數字)的bytes文字語法來表示它。 (或者使用相應的 ASCII 字符,如果適用的話。
  • 或者,創建字節值的列表(或其他可迭代),並將其傳遞給bytes構造函數。

如果您想從代表 UTF-16 字符串的文件中讀取字節,假設您知道字節順序,那么這很簡單:

  • 以二進制模式打開文件並讀取任意數量的字節。
  • 要獲取對應的字符串,請使用bytes對象的.decode方法。

如果您有b"\У\к\р\а\и\н\а"並希望將其視為"\У\к\р\а\и\н\а" 並且由於某種原因,您無法修復給您這個錯誤輸入的過程,那么這就是unicode-escape編解碼器的用途。

暫無
暫無

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

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