歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 讓Netatalk支持雙字節和多字節字符集

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

日期:2017/3/6 15:47:54   编辑:關於Unix
一、 問題出現 通過安裝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
  其中有三個文件maclearcase/" 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存盤即可.

Copyright © Linux教程網 All Rights Reserved