跨平台中文檔名亂碼的解決

2021-04-14 22:47:49 字數 1547 閱讀 4322

事情的起因是這樣的~~

但是好日子在前幾天到頭了。我前一陣又弄了一台p3的機器裝了ubuntu。問題出現了:

首先是在windows上用filezilla連線ubuntu時看到的中文檔名全是亂碼,但是用putty通過ssh連線ubuntu卻是正常 的(原先是亂碼,後來改設定為utf-8編碼就好了,不過filezilla沒有類似的設定可改)。如果用filezilla向ubuntu上傳本地的中 文檔案,則在filezilla裡看到remote端的檔名是正確的,但在putty裡看到是亂碼。

折騰了好幾天之後,我才想到應該研究一下幾個系統上的locale設定究竟是如何的——坦白說,要不是因為搜到的資料裡有提到這方面,我從前還真沒注意到這回事。在freebsd和ubuntu上分別執行了locale命令檢查的結果是:

freebsd的lc_all為「c」,即」posix」的別名,似乎是一種無固定編碼的方案,或者可以認為就是本地編碼,預設的設定。

ubuntu的lc_all為「zh_cn.utf-8」,這個是我設定的。

windows不必說了,肯定是本地編碼——只是我沒有想到的是,公司裡用的英文版windows居然也是本地編碼,我一直以為是unicode的,看來是為了保持相容。

這樣就好理解了,filezilla不改變編碼方式,所以當remote端與本機的編碼不一致時,必然亂碼。所以在windows上用 filezilla連線ubuntu看到亂碼,而我的putty因為是設定為utf-8編碼,所以看到的是正確的——因為ubuntu一端是utf-8。 而如果用filezilla上傳中文檔案,則因為windows是本地編碼,所以上傳以後仍然為本地編碼(gb系),而ubuntu是utf-8所以是亂 碼。

freebsd那邊的問題也是一樣的,因為那些檔案都是以前從windows上傳上去的,用的都是gb系編碼,而早年我用putty都是用預設的本 地編碼方案,所以一直沒有發現問題。這樣的話,因為freebsd是本地編碼,與ubuntu的utf-8不一致,所以怎麼弄都是亂碼。

但是據說用7zip這樣的工具打包以後是可以解決這樣的編碼不一致問題的,我試了卻沒有成功。後來才想明白,因為7zip是根據系統的locale設定來對檔名進行相應的處理,因為原來我處理的時候檔名是gb系的編碼,而系統是設定為utf-8,所以總也不對。

最後的解決方案是:

在ubuntu上用以下命令:

export lc_all="zh_cn.gbk"

scp raptor@freebsdserver:/home/raptor/myfiles/*.* .

export lc_all="zh_cn.utf-8"

convmv -f gbk -t utf-8 --notest *.*

原理就是先把ubuntu的locale改為gbk,然後用ssh copy檔案過來,再改locale為utf-8,然後用convmv來轉換檔名的編碼。

不過經過試驗表明,不改變locale直接scp也是可以的,因為scp並不會改變檔名的編碼方式,不過改了locale以後便於在轉編碼之前檢查scp過來的內容(否則scp過來是亂碼,要到轉編碼後才正常)。

歸根到底這些問題都是因為該死的windows用本地編碼來記錄檔名,unicode化做得不夠徹底。

Linux 中文檔名亂碼解決 FTP檔名亂碼

linux下中文顯示亂碼是因為linux中使用的是utf 8編碼 windows使用的是gbk編碼 可以在linux中使用convmv工具來對檔名進行轉碼 當然如果檔名轉碼為utf 8後 在windwos資源管理器中使用ftp進行檢視時就會亂碼 可以把liunx中的檔案轉碼成gbk後在windows...

linux下中文檔名亂碼解決

在windows上使用ftp上傳檔案到linux上,中文名稱在linux系統中顯示為亂碼。雖然將linux的env設定了lang en us.utf 8,並且本地的shell客戶端編碼也設定成utf 8,但在shell中 或通過http訪問 仍是亂碼 原因在於,windows 的檔名中文編碼預設為g...

linux下中文檔名亂碼解決

在windows上使用ftp上傳檔案到linux上,中文名稱在linux系統中顯示為亂碼。雖然將linux的env設定了lang en us.utf 8,並且本地的shell客戶端編碼也設定成utf 8,但在shell中 或通過http訪問 仍是亂碼 原因在於,windows 的檔名中文編碼預設為g...