2017-06-14 29 views
0

我試過編碼/解碼與選項'surrogatepass'和'surrogateescape'的各種組合無濟於事。我不確定這是什麼格式(它甚至可能是Autoit中的一個錯誤),但我知道有一個事實,因爲至少有一個在線utf解碼器是正確的。在在線轉換器網站上,我將文件指定爲utf8並將輸出指定爲utf16,並且輸出如預期。我如何從Python3中的Éphémère獲得?

回答

1

我的問題是在文件閱讀過程中。我通過在open()的選項中指定encoding ='utf-8'來解決它。

open(filePath, 'r', encoding='utf-8') 
3

這個問題被稱爲mojibake,如果您有與UTF-8編碼的文本流出現您的具體情況,和您Windows-1252解碼它(這是ISO 8859-1一個超集)。

因此,如果您已經有found out,則必須使用UTF-8解碼此文件,而不是使用默認的Python編碼(在您的情況下似乎是Windows-1252)。


讓我們來看看爲什麼這些特定的亂碼字符出現在你的榜樣,即:在É

  • é的地方

    • É在é
    • A的發生在è

    下表總結了發生了什麼事情:

    Code table

    所有的E的,E和E的非ASCII字符,並且它們使用UTF-8編碼的2字節長的代碼。

    例如,對於E中的UTF-8碼是:

    11000011 10001001 
    

    在另一方面,Windows-1252是一個8位的編碼,即,其編碼其字符的每一個字符設置爲8位,即一個字節。因此,如果您現在使用Windows-1252解碼位序列11000011 10001001,則Windows-1252將其解釋爲兩個1字節代碼,每個代碼表示單獨的字符,而不是代表單個字符的2字節代碼:

    • 第一字節11000011C3十六進制)恰好是字符Ã(Unicode代碼點U + 00C3)的Windows的1252碼。
    • 第二個字節1000100189,十六進制)恰好是字符(Unicode代碼點U + 2030)的Windows-1252代碼。

    您可以查看這些映射here

    所以,這就是爲什麼你的解碼呈現Ã而不是É。同樣適用於其他非ASCII字符é和è。