linux中,我的LC_ALL環境是zh_CN.gbk。
當我把中文文件名文件cp到windows的fat32盤下後,重起進入windows後發現文件名全是亂碼。
首先google,baidu了下,發現都推薦用convmv,這個工具是用perl編寫的,確實非常好用的工具,不過在我這裡它不適合。
----------------------------------我是華麗的分割線---------------------------------
還是拿具體例子來說話,比如說文件,政治.txt,先說下造成亂碼的根本原因,在windows下用winhex查看後,發現,
那些文件名確實是gbk編碼,只不過,編碼給分開了。
政治,gbk編碼 D5FE D6CE ,可是在硬盤上存儲的時候卻變成了,D500 FE00 D600 CE00。就算沒有多出這些00,我自己手動
改成 D5FE D6CE也不可以,因為windows下用的是unicode編碼。
----------------------------------我是華麗的分割線---------------------------------
嘗試下在linux中用convmv把gbk轉成unicode看看,不過之前,先用hexedit看下。
無法轉換成unicode,ucs-2le或者utf-16le,因為linux不支持,這個編碼的文件名...
結果發現,hexedit不能看文件名,它只是看內容的。
----------------------------------我是華麗的分割線---------------------------------
從linux再在ntfs下面寫個文件名看看,是不是也是亂碼。
這個發現不是亂碼,並且用這個方法成功解決問題。
解決方法:把亂碼的文件和文件夾,在linux下,從fat32盤,cp到/root,然後再mv到ntfs盤,就ok了~。
----------------------------------我是華麗的分割線---------------------------------
問題總結:
自己費了好多時間,10幾個小時,研究怎麼在fat32上面恢復中文,除了手工自己修改外,
在linux下面用convmv怎麼都不行。因為linux內置支持utf-8,可是不支持utf-16。
所以在最後執行rename 操作時,識別不了utf-16的文件名而報錯。
不過,倒是因為這個問題,我對編碼的各種方式和區別,還有轉化方法,有了更好的認識~
----------------------------------我是華麗的分割線---------------------------------
原因分析:
在掛載 我的fat32盤時,mount設置了編碼方式為gbk. ntfs沒有發現用什麼設置,
難道這個是原因?再進入linux自己研究下。