只速記一下,工作時遇到的aws機器上utf-8檔名的問題(每次遇到都花很多時間處理)
遇到的問題是要從windows將utf8(中文)的檔案與資料夾搬到aws的機器上用python3進行處理
我們會先將資料zip起來在搬過去(太多也太大)
總共會連續遇到幾個問題
在windows使用內建的zip,格式好像是用utf16儲存檔名(未驗證)
解法: 使用7zip, winrar.....等
如果上一步是正確的utf8,解壓縮後在cli下ls還是會看到一堆問號
但是如果將檔案move回mac上是正常顯示的
(我記得utf16好像也是正常顯示,mac威能)
import os
print(os.listdir('.'))
得到了類似unicode的編碼,我沒有截圖
但這串code是str且轉不回unicode(每個字有三個bytes) 我沒有特別去研究這編碼
做了超久的嘗試,最後在網路上找到了LCALL, LCCTYPE, LANG等linux locale參數
死馬當活馬醫,設LCALL=enUS.UTF-8
linux下 ls就顯示正常,然後進了python也顯示正常了!!!!!!
locale就是像windows的地區一樣,設置系統用的語言環境
一般沒設的話應該就是C(sytem default,但這default到底是什麼?)
設成en_US.UTF-8後,理所當然ls應該是會改變的,但python為什麼會變呢
研究以後發現python的listdir, open,.....的實作是用C語言的(我指的是cpython compiler,一般人裝的都是這個)
而在讀值的時候就會吃環境變數(但是像file.read就能指定encoding)
所以修改了LC_ALL不只std out的format,連python code也能正常顯示listdir囉
至於LC_ALL LC_CTYPE LANG就想成LC_ALL > LC_CTYPE > LANG,上位的設置以後下面的就失效了