精華區beta FreeBSD 關於我們 聯絡資訊
※ 引述《=^_^[email protected] (=^_^=)》之銘言: : 各位先進,請教一個問題 : 在samba中,可設定codepage=950來解決中文的問題 : 我在netatalk中,沒得設定, : 在 man AppleVolumes.default 找到 : codepage:[nls file] : The codepage option loads a specific codepage from : the nls directory. : 我也去找 nls directory 中,發現了 : maccode.437 : maccode.850 : maccode.iso8859-1 : maccode.iso8859-1.adapted : 這幾個檔案 : 但是,我卻無法看出裡面是寫啥,所以我無法仿製 : 上網查資料,卻也都沒提到如何製作 >< : 不知先進們,有沒有解決方法? : 或是說明資料,可供我查閱? 下面有一篇文章供您參考。由於找不到作者修改的檔案,所自己 摸摸看,整理出下面的心得,如果有錯,請各位前輩不吝指教。 首先來看 maccode.iso8859-1 這個檔,你應該可以輕易的發現, 一個規律,那就是間隔的 Hex code 是 0x03 左邊是原來的編碼 (例如: 0x80)右邊是所對應的編碼(例如: 0xC4),所根據 廖前輩的說法,只要將 0x80 直接對應成 0x80(也就是說將 0x4C 改成 0x80 即可)。修改的範圍是 0x80 - 0xFE 經過這樣的對映後 就可以涵蓋所有 CJK 字集了。 在 FreeBSD 上可以用 hexedit 來修改 binary file,由於手邊沒有 MAC 所以不能測試,改天再把修改好的 po 到版上讓大家玩玩 :p 00000000 CF AF 02 0A 01 03 00 14 00 75 69 73 6F 38 38 35 .........uiso885 00000010 39 2D 31 00 03 80 C4 03 81 C5 03 82 C7 03 83 C9 9-1............. ^^^^^^^^ 00000020 03 84 D1 03 85 D6 03 86 DC 03 87 E1 03 88 E0 03 ................ 00000030 89 E2 03 8A E4 03 8B E3 03 8C E5 03 8D E7 03 8E ................ 00000040 E9 03 8F E8 03 90 EA 03 91 EB 03 92 ED 03 93 EC ................ 00000050 03 94 EE 03 95 EF 03 96 F1 03 97 F3 03 98 F2 03 ................ ----8<-------------------------------------------------------------------- ‧讓Netatalk支持雙字節和多字節字符集 廖中熙 ------------------------------------------------------------------------ 摘自:大陸新聞組 From: [email protected] (奮鬥無止境‧愛拼才會贏) 簡介 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碼了。 -- , ~ \ Bigfish -- ※Post by bigfish from 61-223-138-150.HINET-IP. ◢ ◣ ███◣ ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂ █◢◣█ █ █ 風塵埃的對話 BBS ˙ wdbbs.net ◥◤◥◤ ███◤ ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ > -------------------------------------------------------------------------- < 發信人: [email protected] (Perfect Cream), 看板: FreeBSD 標 題: Re: codepage 一問 發信站: 風與塵埃的對話 BBS (Fri Jul 26 10:54:16 2002) 轉信站: Ptt!news.ntu!freebsd.ntu!wd-news!WD ※ 引述《bigfish (Perfect Cream)》之銘言: : 下面有一篇文章供您參考。由於找不到作者修改的檔案,所自己 : 摸摸看,整理出下面的心得,如果有錯,請各位前輩不吝指教。 : 首先來看 maccode.iso8859-1 這個檔,你應該可以輕易的發現, : 一個規律,那就是間隔的 Hex code 是 0x03 左邊是原來的編碼 : (例如: 0x80)右邊是所對應的編碼(例如: 0xC4),所根據 : 廖前輩的說法,只要將 0x80 直接對應成 0x80(也就是說將 0x4C : 改成 0x80 即可)。修改的範圍是 0x80 - 0xFE 經過這樣的對映後 : 就可以涵蓋所有 CJK 字集了。 : 在 FreeBSD 上可以用 hexedit 來修改 binary file,由於手邊沒有 : MAC 所以不能測試,改天再把修改好的 po 到版上讓大家玩玩 :p OK 改好了... 轉寄回去用 uudeview 就能解出 maccode.asian 使用時 codepage 後面加上 asian 就能用了吧... I think :p 研究了半天除了前面所講的對應外,有兩個地方要注意,分別是 hex addr. 3 與 hex addr. 7 這兩個位元(注意從 0 開始算起)hex 3 這個位元代表 codepage 名稱(如 uiso8859-1)的長度, hex 7 則表示對應開始的位置 看下面的圖示應該會比較容易明白,uiso8859-1 共十個字,開始對應的地方是 hex addr. 14 00000000 CF AF 02 0A 01 03 00 14 00 75 69 73 6F 38 38 35 .........uiso885 ^^ ~~ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 00000010 39 2D 31 00 03 80 C4 03 81 C5 03 82 C7 03 83 C9 9-1............. ^^ ^^ ^^ ~~ 不知道正不正確... 請大家試試囉... --- SOF --- MIME-Version: 1.0 Content-Type: application/octet-stream; name="maccode.asian" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="maccode.asian" z68CBgEDABAAYXNpYWluAAOAgAOBgQOCggODgwOEhAOFhQOGhgOHhwOIiAOJiQOKhAOLiwOMjAON jQOOjgOPjwOQkAORkQOSkgOTkwOUlAOVlQOWlgOXlwOYmAOZmQOamgObmwOcnAOdnQOengOfnwOg oAOhoQOiogOjowOkpAOlpQOmpgOnpwOoqAOpqQOqqgOrqwOsrAOtrQOurgOvrwOwsAOxsQOysgOz swO0tAO1tQO2tgO3twO4uAO5uQO6ugO7uwO8vAO9vQO+vgO/vwPAwAPBwQPCwgPDwwPExAPFxQPG xgPHxwPIyAPJyQPKygPLywPMzAPNzQPOzgPPzwPQ0APR0QPS0gPT0wPU1APV1QPW1gPX1wPY2APZ 2QPa2gPb2wPc3APd3QPe3gPf3wPg4APh4QPi4gPj4wPk5APl5QPm5gPn5wPo6APp6QPq6gPr6wPs 7APt7QPu7gPv7wPw8APx8QPy8gPz8wP09AP19QP29gP39wP4+AP5+QP6+gP7+wP8/AP9/QP+/g== --- EOF ---