接手了一個新工程,碰到一個問題,就是使用java的File.listFiles 方法獲取路徑下的文件,問題是:獲取的中文文件名是亂碼!!!體現出來的症狀是通過java的File API找不到文件。
最初就懷疑是環境問題,第一步排查環境變量:
# linux 的 proc 中導出環境變量
cat /proc/10643/environ| tr '\0' '\n'
注:自己替換一下進程ID
發現沒LANG,就給配置加上了:
export LANG="en_US.UTF-8"
但是重啓進程之後問題依舊!
接下來,翻看了java的File類的實現,發現是通過FileSystem對應的native方法實現的,這部分是C的代碼,接下來就懷疑是"LC_XXX"的環境變量的干擾!
基於這個想法,接着加上了環境變量:
export LC_ALL="en_US.UTF-8"
重啓之後,問題消失。
總結:
估計是啓動進程的某個環節,引入了LC_XXX的某個配置,導致C的語言環境配置被變更,使獲取的文件名的編碼和預期不一致。解決方法比較粗暴,通過LC_ALL覆蓋所有的配置。
附:
java 配置中文環境
-Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en
export LC_ALL="en_US.UTF-8"