一、 問題出現 通過安裝samba 和netatalk,實現了PC與蘋果機通過Linux共享的問題。但是蘋果機傳中文文件名到Linux, 但是Linux及windows卻看不見中文;PC存中文文件名在共享路徑,蘋果機看得見,但卻無法拷備,錯誤返回:文件找不到。列表舉例描述如下: PC(Linux)文件名 操作: 由蘋果機拷貝文件 蘋果機 (Mac OS) Abc Abc Abc Abc :0B:0B 薄(HEX 0x0B0x0B) 薄(HEX 0x0B0x0B) 看得見文件名,但是找不到文件
二、 分析問題 由上表可見, 當文件名中的字符都在美國標准ASC碼(碼值小於或等於0x7F)則可以正常顯示。 當文件名中的字符不在美國標准ASC碼(碼值大於0x7F小於0xFF)則不能正常顯示。 Netatalk 有沒有自已的解決辦法呢? 我查看它的配置文件/etc/atalk/AppleVolumes.default 很幸運,我看見它有一個codepage參數,形式如下 codepage=文件名 文件是在nls 路徑下 我想這下可解決了,我立即作起實驗來。 第一次codepage=936 第二次codepage=cp936 注:cp936是GB2312-1980的代碼頁 nls 是 nls(National Language Sopport)子系統它是基於ASC的提供國際化本地化的一種機制。只要通過正確的字符映射表就可以正確處理本地語言編碼了。 結果如何?全部失敗。 結論:Netatalk另有一套nls機制來解決本地化問題。
三、解決問題 1. 目標 PC[Linux]下的文件名 操作(由蘋果機拷貝文件) 蘋果機[MAX OS]下的文件名 薄(HEX 0x0B0x0B) , 薄(HEX 0x0B0x0B) 2. 查找路徑nls 找到路徑/usr/lib/atalk/nls 其中有三個文件maccode.437, maccode.850,maccode.iso8550-1 用這些codepage來試,都不行。中文在蘋果機看比原來還糟,當然了映射的不對嘛! 3. 上網找一找,也沒有支持中文的maccode 4. 只有自己做一個了。 5. 用二進制查看器分別查看了maccode.437,maccode.850,iso8550-1找出了規律。因為十分簡單,不必細說。有興趣的朋友,可以自己去看看。 6. 我首先用GB2312的編碼來作實驗。大家都很熟悉,它的編碼范圍是0xA1----0xFE,思想再簡單不過了,就是讓中文編碼的ASC碼在傳送後保持不變即可。 7. 實驗成功。 8. 擴展。我查閱了亞洲文字集的編碼(雙字節編碼或多字節編碼)范圍。認為將映射擴大到 0x80----0xFE應該可以支持所有的亞州文字。 標准 編碼范圍 最小值 最大值 GB2312-1989 第一個字節:0xA1----0xF7 0xA1 0xFE 第二個字節:0xA1----0xFE GBK 第一個字節:0x81----0xFE 0x40 0xFE 第二個字節:0x40----0x7E 0x80-----0xFE BIG-5 第一個字節:0x81-0xFE 0x40 0xFE 第二個字節:0x40-0x7E 0x81----0xFE Shift-JIS 第一個字節:0x81-0x9F 0xE0-0xFC 0x40 0xFC 第二個字節:0x40—0xfc(少0x7F) KSC-5601-1987 第一個字節:0x81-0xFE 0x41 0xFE 第二個字節: 0x41-0x5A, 0x61-0x7A, 0x81-0xFE 由於當ASC碼小於0x7F都可以正常轉化,所以我們可以不去理它,只考慮ASC碼大於0x80以上的。得到映射范圍是0x80----0xFE.
四、 如何使用maccode.Asia 1.找到nls路徑, 例如,我的機是/usr/lib/atalk/nls 2.將maccode.Asia拷貝下去 3.找到appletalk的配置文件AppleVolumes.default並修改之。 例如:我的機上是/etc/atalk/AppleVolumes.default 例如:/mnt/appletalk是你共享給蘋果機的路徑 你原來寫 /mnt/appletalk 現在加一點 /mnt/appletalk codepage=maccode.Asia存盤即可.