摘自:大陸新聞組
From: HbBdByXc.bbs@bbs.dqpi.edu.cn (奮鬥無止境·愛拼才會贏)
簡介
Netatalk 是Linux上提供Appletalk網絡協議服務的服務器。可以令Linux“偽裝”
成為蘋果機服務器,提供文件及打印服務。但是中文名文件卻無法傳輸,這帶來了
一些不便,但Netatalkr提供了的一個nls機制,但是沒有中文(多字節編碼)支持
,我通過制作的這個字符映射表maccode.Asia,問題解決了。
關鍵字
Linux、netatalk、appletalk、雙字節、多字節、中文、漢化
所用Netatalk版本
首先,我要告訴您的是我用的Netatalk版本是netatalk-1.4b2+asun2.1.2-2 rpm,
其下所提到的路徑都符合這一版本,如果您所用的不一樣,則需要勞煩您自行查找
了。
一、問題出現
通過安裝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,macc
ode.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存盤即可。
五、後記
我後來又查閱了netatalk 1.5的關于制作maccode的代碼,發現它與1.4版本完全不
同,所以上面作的那一個不支持1.5,我也仿照它的程式寫了一個但沒有地方試驗。
注:1.5的maccode可以只作某個方向的轉化,我真不知什麼時候編碼會只作單向轉
化。包括他自己的三個maccode都沒用上這個單向轉化機制(都是雙向的)。 他們
想的真是夠長遠的。
六、總結
通過這次學習和練習,我覺得它的這個nls機制真好, 令字符集支持擴展特別簡單
。亞州文字的字符集多是雙字節的(現在也有多字節的了),主要是利用兩個字節
組合來表示一個雙字節字的編碼的, 對于每個字節來講並沒轉化成其它的ASC碼。
所以也使得多種亞州文字的字符集(雙字節字符集、多字節字符集)都可以利用同
一張映射表來解問題。
蘋果字符集編碼與PC[Linux]的並不完全相同,Netatalk給出的幾個映射表maccode
。437,maccode.850,maccode.iso8559-1 可以看出它們將0x80以後的都轉化為其
它的ASC碼了。