java+linux的中文環境問題的排查


接手了一個新工程,碰到一個問題,就是使用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"

export LANG="en_US.UTF-8"



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章