一、 問題出現 通過安裝samba .net atalk,實現了PC與蘋果機通過 Linux 共享的問題。但是蘋果機傳中文文件名到Linux, 但是Linux及 windows 卻看不見中文;PC存中文文件名在共享路徑,蘋果機看得見,但卻無法拷備,錯誤返回:文件找不到。列表舉例描述如下: P
一、 問題出現 通過安裝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
其中有三個文件ma
clearcase/" target="_blank" >ccode.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存盤即可.