弟管理學校的網頁伺服器,該伺服器也同時是大家的分享檔案集散中心,是以Linux架設起來的,該伺服器以 Unicode 作為系統編碼,而其他Windows系統則是big5(MS950)編碼,最近我要讓另一台 Linux 的主機(Unicode)掛載該伺服器所分享的檔案,編碼轉換的問題讓我頭痛了一個禮拜,最後發現到該伺服器更新的內容並未於網頁中更新,以下便是弟從文件中找出來的設定:
目前(2009/08/12)最新版本的Samba仍存在下面的選項。
伺服器端語言設定選項有三個(/etc/samba/smb.conf中預設沒有這三個選項,需自行加入):
display charset = UTF8
dos charset = cp950
unix charset = UTF8
display charset = UTF8
輸出訊息到 stdout,stderr (也就是在伺服器自己的銀幕上顯示訊息)時所用的編碼。這邊應該是指輸出訊息,通常設定成與底下的unix charset選項相同。
dos charset = cp950
DOS客戶端連接到伺服器時,所使用的編碼。測試結果不管是Unix或windows都使用這個編碼設定,在設定該伺服器給中文Windows存取時,應使用這個新的參數,在smb.conf裡面沒有 950 這種參數,一定是 "cp950",google上面有些文章寫950,少了cp 兩個字元,那是不正確的,在 testparm 檢查時會失敗。
unix charset = UTF8
本機Linux檔案系統所使用的編碼方式。Samba必須要知道本機的編碼方式,才能正確的轉換要送給客戶端的訊息,這個選項在一般情況下,應與您 Linux 伺服器系統編碼相同,也就是 /etc/sysconfig/i18n內所設定的編碼方式。
範例1.Linux作業系統編碼為 big5 (換句話說,/etc/sysconfig/i18n裡面所設定的預設編碼是 Big5 時),而Samba Server要分享檔案給繁體中文的 Windows 系統時,則伺服器該如下設定:
display charset = cp950
dos charset = cp950
unix charset = cp950
範例2.Linux作業系統編碼為Unicode,而Samba Server要分享檔案給繁體中文的 Windows 系統時,則伺服器該如下設定:
display charset = UTF8
dos charset = cp950
unix charset = UTF8
簡單的說,在一般情況下,"display charset"與"unix charset"選項設定成與作業系統編碼相同(/etc/sysconfig/i18n),"dos charset" 選項設定成 cp950即可,特殊情況調整客戶端的掛載方式也能正確接收編碼。
註1:"client code page = 950" 這個參數在 FC4版本以 testparm 測試時,已經不存在,故應使用上面三個語言參數。
目前(2009/08/12)最新版本的Samba客戶端功能已經大幅的修改了連線方式,採用的檔案格式為 CIFS(Common Internet File System),已經不再有中文顯示問題(不論伺服器端是dos charset=UTF8 or CP950,也不論客戶端是Windows or Linux),若您的機器可以升級到最新版本的 Samba 客戶端,請使用下面的指令連線:
mount -t cifs -o username=my_name,password=my_pass //xxx.xxx.xxx.xxx/share_floder /dest
若您的機器無法更新到最新版本的 Samba 服務(如Embedded System),您可以參考以下的連線方式。
Client 端掛載的語言選項也有三個(使用 mount 或 smbmount 指令掛載時,加在 -o 選項後面):
iocharset = UTF8
codepage = cp950
unicode
iocharset = UTF8 指定本機電腦所使用的編碼方式。這個選項在一般情況下,應與您 Linux 客戶端主機所使用的編碼方式相同,也就是 /etc/sysconfig/i18n 內所設定的編碼方式。
codepage = cp950 指定遠端伺服器送出訊息的編碼方式。
unicode 使用 unicode 來與伺服器通訊。
範例1.將Linux當作客戶端,掛載另一台 Linux Samba Server,而該 Server 中的 "dos charset" 設定成 cp950 時,應如下掛載:
mount -t smbfs -o username=my_name,password=my_pass,codepage=cp950 //xxx.xxx.xxx.xxx/share_floder /dest
範例2.將Linux當作客戶端,掛載另一台 Linux Samba Server,而該 Server 中的 "dos charset" 設定成 UTF8 時,應如下掛載:
mount -t smbfs -o username=my_name,password=my_pass,codepage=UTF8 //xxx.xxx.xxx.xxx/share_floder /dest
範例3.將Linux當作客戶端,掛載另一台繁體中文 Windows 系統的分享目錄時,應如下掛載:
mount -t smbfs -o username=my_name,password=my_pass,codepage=cp950 //xxx.xxx.xxx.xxx/share_floder /dest
關於掛載的方式,端看 Samba Server 所送出來的字型編碼是何種編碼(dos charset 選項),客戶端只要使用相同的編碼接收便能正確顯示。而使用 iocharset=cp950 的參數在此範例中會失敗(是顯示字型失敗,不是掛載失敗)。
以上,請參考。
弟於日前決定將伺服器的作業系統編碼改為 Unicode ( /etc/sysconfig/i18n 中設定為 LANG="zh_TW.UTF-8" ),編碼上有些問題,上述的文章是因為這個原因所測試出來的結論。另外,將作業系統預設編碼改為 Uniocde 後,測試到現在仍有二個問題:
第一:掛載具有 big5 編碼的磁碟時,雖然不會有錯誤訊息,但是當從作業系統中複製具有中文或其他多語言檔名時,會有無法複製的錯誤。此問題解法敘述於底下文章的連結中。
第二:在 Windows 中,目前還沒有 FTP 的客戶端(如 CuteFTP,FileZilla 等)支援SFTP多語言顯示。此問題目前弟還無解,但是根據 FileZilla(http://filezilla.sourceforge.net/)的 mailling list 的文章中已經有網友解決此問題,目前所釋放出來的版本尚未支援,需等待一段時間,待該版本納入FileZilla支援後,才能夠正常顯示。在此有網友修正的執行檔(http://www.teatime.com.tw/~tommy/filezilla.zip),該執行檔為2.2.13版的執行檔,弟以2.2.17版本的套件覆蓋此執行檔能正常執行。或者另一個替代方案是使用 WebFTP(http://www.Web-FTP.org/) 與 phpWebFTP(http://www.v-wijk.net/) 從網頁中顯示中文,但此法無法支援續傳。
弟找到關於作業系統以 Unicode 編碼的中文顯示的一些解法的網頁,該往頁位於http://wiki.debian.org.tw/index.php/Unicode 該網頁有許多使用Unicode作為作業系統編碼會發生的錯誤。
當您要更新網頁資訊時,請您參考。
兩位大哥好:
小弟目前也有語言設定的困擾,目前小弟的狀況如下:
smb.conf
display charset = UTF8
dos charset = UTF8
unix charset = UTF8
這樣的結果我的ftp所看到的中英文都正常,上傳下載也沒問題,但如果我用網芳去看這個share時,中文檔名就會變成亂碼;同樣的,如果我在用網芳建立一個中文檔名,從ftp(用smbmount的share,沒有指定codepage)看到的亦會是亂碼(在網芳則是沒問題),這是否代表網芳和 ftp所使用的是不同的語系呢?
目前我所使用的kernel是2.4.31,kernel看menuconfig並不支援cp950,請問兩位大哥能給小弟一些建議嗎?
感謝~
针对以上问题,有两个回复:
回复一:
好像 kernel 的預設參數只能寫數字,所以,在 make menuconfig 時,直接輸入 950 即可。
根据以上回复,提问者作了应用修改,给出以下回复:
謝謝站長的回應,經過一些測試後,我已將相關code page (utf-8, cp950) load進kernel.
但相同問題仍然存在。若將smb.conf 設定如下:
display charset = UTF8
dos charset = UTF8
unix charset = UTF8
即可在ftp(用smbmount的share)與網芳"分別"顯示中文。
然而,ftp與網芳的中文還是不通的,這是否代表有一邊不是unicode呢?
應如何使兩邊都是使用unicide呀
謝謝兩位的回應。
Latrell.
回复二:
首先您得先確認您的 Linux 伺服器端是否為 UTF8 編碼,端看 /etc/sysconfig/i18n 中的設定,若您的 Linux 伺服器編碼為 UTF8 ,您的 samba 設定檔應採用:
display charset = UTF8
dos charset = cp950
unix charset = UTF8
若您的 Linux 伺服器端所設定的編碼為 big5 ( /etc/sysconfig/i18n 中設定為 LANG="zh_TW.UTF-8" ),則應採用:
display charset = cp950
dos charset = cp950
unix charset = cp950
另外,Windows 並不是使用 Unicode 的編碼,微軟有自己的一套方法解決多語言顯示問題,在繁體中文上 windows 是使用 big5 編碼(若用程式抓編碼法出來看會得到 MS950,對應到 Linux 上的 CP950,兩者都是 big5 編碼),這點在弟先前的文章中疏忽敘述這個部份,請見諒,也感謝您告知文章中的不足,弟馬上補上。
第二个提问:
鳥哥,你好!!俺是個菜鳥,有關于samba主機上查看共享資料亂碼問題想請教一下大家!
我的samba主機用的是Cent os 5.5 ,主機語言:i18n設定:LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
smb.conf設定:
unix charset = UTF-8
display charset = UTF-8
dos charset = cp950
在windows xp(繁體系統) 下訪問samba主機建立中文資料及資料夾一切正常,但在samba主機上看windows xp 寫入的中文資料件及文件夾都是亂碼,英文資料一切正常,請問大家這是哪裹的問題?感謝!!
回复:
您是如何在 Linux 環境下查閱檔名的?
是純文字模式?是圖形介面?還是透過 Windows 連線到 Linux 的 pietty 呢?
不同的環境得要考量到語系與軟體之間編碼的相關問題喔!