誠然,這不是一個很好的標題,但說實話,我不確定如何在不發布一篇文章作為問題的情況下措辭這個問題。這個描述應該要加點肉。
問題:
我有一個 Python 腳本(不是我寫的),我使用 Python 2.7 在 Windows 中運行。這是相對基本的,從各種來源提取資訊並將輸出列印到終端。其中一些輸出使用非 ASCII 字符集中的字符,這就是有趣的地方。
雖然 Python 腳本在終端機列印到螢幕上運行正常,但當我新增檔案重定向時,我收到一個錯誤,並且 Python 腳本崩潰了。經過大量研究後,這似乎可以歸結為 Python 2.7 處理 Unicode 的方式,我透過為 Python 設定 Windows 環境變數來解決這個問題。這是:
$env:PYTHONIOENCODING="UTF-8"
在 PowerShell 中,以及
Set PYTHONIOENCODING="UTF-8"
在命令中。
好的,現在 Python 腳本輸出可以重定向到檔案而不會崩潰。問題是,兩種環境給出不同的結果。運行Python腳本的基本格式是:
python pythonscript.py parm1 > test.txt
雖然這在 CMD 和 PowerShell 中都有效,但我最終得到了一個具有不同編碼和字元的檔案。例如,引起問題的字元是ø
。如果我在 CMD 中運行上面的行,生成的檔案將被編碼為UTF-8
並正確顯示該字元。在 PowerShell 中,執行相同的命令會產生一個編碼為UCS-2 LE BOM
(如 NotePad++ 所示)的文件,而上面的字元實際上顯示為 2 個字元├©
。
更奇怪的是,如果我不在任何環境中重定向(因此,只需列印到終端),兩者都會顯示不正確的字元。
我還嘗試在 PowerShell 中透過管道傳輸到輸出檔案 CmdLet,因此:
python pythonscript.py parm1 | out-file -encoding UTF8 test.txt
這會導致文件編碼為UTF-8-BOM
,但仍然會出現不正確的字元。我在這裡嘗試了不同的編碼類型,雖然我最終得到了不同的文件編碼和不同的字符,但似乎沒有什麼是正確的。
我還透過運行查看了兩個環境的代碼頁chcp
。在這兩種情況下都會返回Active code page: 850
.我嘗試將 PowerShell 設定為65001
(即utf-8
)的程式碼頁,但這沒有什麼區別。
所以,我徹底困惑了。