簡體   English   中英

為什么 python 的 open() 函數會破壞我的 utf-8 文件?

[英]Why does python's open() function mangle my utf-8 files?

這是一個奇怪的問題,可能是由於 python 更新,因為它昨天運行良好,沒有任何變化。 開始了:

我有一個程序可以打開 utf-8 文件(使用重音字符等,而不僅僅是 ansi 字符)。 當我使用open(file, encoding="utf-8-sig").read()非ansi 字符會被破壞,如我的終端中所示:

open()編碼設置為"utf-8-sig"時損壞的字符

但是,當我將編碼設置為"ansi" ,字符完全正常!

encoding="ansi"普通字符

這對我來說完全是個謎。 如前所述,昨天這工作正常。 我已經多次檢查過這些文件確實是 utf-8。 不知道是open()函數的問題,還是顯示字符時print()函數的問題。 無論如何,這很奇怪。 "ansi"版本將是一個解決方案,但問題是它會導致Lark出現問題,它使用打開的文件的內容。

在我在這里給出的屏幕截圖中,代碼是基本的:

with open(str(GRAMMAR), "r", encoding="utf-8-sig") as grammar:
    print(grammar.read())

什么可能這個問題所致?

我剛剛注意到一些事情: ansi不是編碼。 編碼的正確名稱是ascii 這意味着當我輸入encoding="ansi" ,python 忽略了我要求它設置和讀取文件作為其默認編碼的編碼,通常是 utf-8。 這並不能解釋為什么它不適用於utf-8-sig或為什么 Lark 對我尖叫,但這特定於我的情況。 因此,對於此問題的未來讀者,請檢查兩件事:

  1. 如果要使用 ascii,請鍵入ascii ,而不是ansi
  2. 堅持使用默認值。

在 Windows 機器上,Python 將名稱“ansi”識別為“mbcs”編解碼器的別名,定義為

僅限 Windows:根據 ANSI 代碼頁 (CP_ACP) 對操作數進行編碼。

所以 ansi 是一種有效的編碼,但它與 ASCII 或 UTF-8 不同,因此存在明顯的錯誤。

暫無
暫無

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

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