歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 讓Netatalk支持雙字節和多字節字符集

讓Netatalk支持雙字節和多字節字符集

日期:2017/2/27 9:32:07   编辑:更多Linux
  一、 問題出現   通過安裝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存盤即可.




Copyright © Linux教程網 All Rights Reserved