簡體   English   中英

Python utf-8 轉換為cp1252

[英]Python utf-8 conversion to cp1252

我已經有了代碼來遍歷深層文件結構中的所有文件,其中所有文件都是 utf-8 並且需要轉換為 c1252 aka ANSI。

我需要達到與在任何嚴肅的文本編輯器中隱藏文件相同的簡單結果......為什么會有任何損失? 是的,一些字符被標准地替換為不同的字符:Šš=Šš Čč=Èè Ťť=?? Žž=Žž Ěě=Ìì Řř=Øø Ďď=Ïï Çň=Òò Ůů=Ùù

但是由於像這樣的簡單字符串轉換

>>> print("Šš Čč Ťť Žž Ěě Řř Ďď Ňň Ůů".encode("utf-8").decode("cp1252"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python310\lib\encodings\cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 8: character maps to <undefined>

... 不工作我的機會是什么? 我一整天都在這里和那里閱讀了幾十篇文章,但找不到可行的解決方案或理解這個 cp 轉換 PITA 的地獄。 甚至發現完整的功能和轉換器顯然是為 Python 2 編寫的,但沒有工作。

也不工作:

chcp 65001

Active code page: 65001

           with open(fpath, mode="r", encoding="utf-8") as fd:
               content = fd.read()
           with open(fpath, mode="w", encoding="cp1252") as fd:
               fd.write(content)

或者

          with open(fpath, mode="r", encoding="utf-8") as fd:
               decoded = fd.decode("utf-8")
               content = decoded.encode("cp1252")

你的第一個例子永遠不會奏效。 使用一種方案對 Unicode 字符串進行編碼並解碼為另一種方案是不正確的,但您可以使用生成文件或字節字符串時使用的編碼對其進行解碼,然后將其重新編碼為另一種編碼。 但是,編碼需要支持相同的 Unicode 代碼點。

UTF-8 支持對所有 Unicode 代碼點進行編碼,而CP1252支持 <256,因此如果您使用 go 這條路線,不要指望您的文件包含相同的信息。

有一個errors參數,可以在解碼(讀取)文件和編碼(寫入)文件時使用。 以下是所提供的示例字符串的損失示例:

>>> s = "Šš Čč Ťť Žž Ěě Řř Ďď Ňň Ůů"
>>> s.encode('cp1252',errors='ignore').decode('cp1252')
'Šš   Žž     '
>>> s.encode('cp1252',errors='replace').decode('cp1252')
'Šš ?? ?? Žž ?? ?? ?? ?? ??'

也有無損轉換,但使用替換方案。 請參閱 Python編解碼器文檔中的錯誤處理程序

所以第二個例子可以通過提供errors參數來處理損失:

with open(fpath, mode="r", encoding="utf-8") as fd:
    content = fd.read()
with open(fpath, mode="w", encoding="cp1252", errors='replace') as fd:
    fd.write(content)

暫無
暫無

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

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