前端小誌(轉型中)

一個用來記錄人老會忘記的地方

Locale in linux

2019年04月13日

只速記一下,工作時遇到的aws機器上utf-8檔名的問題(每次遇到都花很多時間處理)

遇到的問題是要從windows將utf8(中文)的檔案與資料夾搬到aws的機器上用python3進行處理

我們會先將資料zip起來在搬過去(太多也太大)

總共會連續遇到幾個問題

  1. unzip的問題

在windows使用內建的zip,格式好像是用utf16儲存檔名(未驗證)

解法: 使用7zip, winrar.....等

  1. 檔案在linux顯示的問題

如果上一步是正確的utf8,解壓縮後在cli下ls還是會看到一堆問號

但是如果將檔案move回mac上是正常顯示的
(我記得utf16好像也是正常顯示,mac威能)

  1. python中顯示的問題
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,上位的設置以後下面的就失效了


展開Disqus
分類
最近文章
友站連結
© 2019 Ernie Yang