歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 從GB2312到Unicode的轉換實現經歷及如何實現Plone的GB2312編碼(一)

從GB2312到Unicode的轉換實現經歷及如何實現Plone的GB2312編碼(一)

日期:2017/2/27 9:21:47   编辑:更多Linux
  這是一篇我寫的關於GB2312碼制轉換及Plone上的GB2312編碼的文章,Html格式的文檔可以在我的主頁上找到,相關的下載也在我的主頁上可以找到。 從GB2312到Unicode的轉換實現經歷及如何實現Plone的GB2312編碼(一) 作者: limodou 最後修改日期:2003/02/28 起因 為什麼要做這個東西?不久前我在Zope下安裝Plone時遇到一個問題,那就是中文化的問題。從Plone上以及CZUG上得知它支持中文,於是我找到潘俊勇的一篇文檔--Plone的Unicode中文方案--上面有詳細的關於如何中文化Plone的過程。[1] 不過他使用的是utf-8編碼,這樣你在浏覽器中查看源碼時看到的都是亂碼(utf-8編碼)。不過我有一個解決的方法是,先在浏覽器中選中要拷貝下來的內容,再打開一個編輯器粘貼下來即可。但這樣只有文本而不是原來的格式了。對於我個人來說喜歡使用GB2312編碼。因此我想能不能在Plone 中使用GB2312編碼呢?下面就是我的實踐。 首先生成GB2312編碼的po文件。安裝好plone後,會找到i18n的目錄,裡面全部是各種語言的翻譯文檔。其中plone-zh- cn.po就是潘俊勇翻譯的utf-8編碼的文檔。用IE打開它,如果是亂碼請改變IE的編碼模式為unicode(utf-8)編碼。這樣就會看到中文了。全選後,打開一個編輯器,粘貼。這樣就自動將utf-8編碼的文檔變成了GB2312編碼的文檔。將其另存一下,我起的文件名為plone-zh- cn-gb2312.po。然後修改文件開始處的Content-Type為charset=gb2312;Preferred-encodings為 gb2312 utf-8。改好後保存。如果大家仔細看plone-zh-cn.po文件,可以看到文件頭的最後一行為"Domain: plone"。這說明後面的翻譯在plone域下使用的。 在Localizer中增加messagecatalog組件,ID可以隨便起。我起的名字叫plone。增加後,點擊plone組件。進入管理界面後,選擇languages標簽。增加語言為Chinese/China [zh-CN],並將其置為default狀態。然後選擇Import/EXPort標簽,在下面的Import處導入剛才創建好的plone-zh- cn-gb2312.po文件。 這時候問題來了。導入時報: Error Type: UnicodeError Error Value: UTF-8 decoding error: unexpected code byte 於是我想是不是我生成的文件有問題。看到i18n裡提供big5編碼的翻譯文件,我想試試它是否可以裝入。但試過後依然不行。 於是我開始到網上到處找資料。在TWZUG上找到一篇文檔設定Plone中文環境。其中寫到要下載一個轉碼包,並將其安裝到python的 bin/lib/encodings目錄下。看來缺省的python的確是不支持gb2312編碼的。於是我打開python環境,進行下列測試。 >>> a="我們" >>> a.decode('gb2312') Traceback (most recent call last): File "<pyshell#1>", line 1, in ? a.decode('gb2312') LookupError: unknown encoding >>> 這說明,python不支持GB2312編碼。我需要裝一個可以支持GB2312編碼的轉碼器才行。 我按照上面那篇文檔的說明,下載了Chinese Codecs 1.2.0包。原本想看一看big5的轉碼器是如何寫的。打開壓縮包一看,不錯還有中文的。這下好了。 Unicode轉碼器 不過我沒有完全采用它的內容,因為我想知道為什麼,怎麼去做。 轉碼器是用來實現Unicode編碼與本地編碼的轉換。因此它需要實現編碼與解碼兩種功能。python的lib/encodings目錄下有許多轉碼器,如果你打開看,在文件頭會告訴你是使用gencodec.py生成的(關於它以後的文章再說)。一般的轉碼器都要從codecs模塊的 Codec類進行派生,需要實現encode和decode兩個功能。其中,encode是用來將Unicode編碼轉換成其它編碼,decode是用來將其它編碼轉換成Unicode編碼。如果你實現了這兩個方法,你的轉碼器基本上就完成了。一個轉碼器寫好後,一般還要注冊才行,可以使用codecs模塊的register函數。不過,你可能在這些轉碼器中看不見這個調用。因為encodings目錄下的__init__.py文件幫你做了注冊工作。在 __init__.py中,它會搜索整個encodings目錄下所有的轉碼器,並一一進行注冊。


其實轉碼器的工作原理很簡單。創建兩個對照表,Unicode->GB2312的編碼對照表和GB2312->Unicode的解碼對照表。將Unicode編碼轉化為GB2312編碼時(即調用encode),對每一個Unicode編碼,查找編碼對照表,找到其對應的GB2312 編碼,並將其合成一個字符串返回即可。將GB2312L編碼轉化為Unicode編碼時(即調用decode),查找解碼對照表,找到其對應的 Unicode編碼,並將其合成一個字符串返回即可。當你仔細閱讀下載的轉換程序時,你會發現Chinese Codecs包中,兩個轉換碼表放在兩個單獨的文件中,其實這樣是沒有必要的。只要我們已經有了一個對照表,可以將鍵與值進行調換即可生成另一個對照表。其實別的轉碼器也是這樣做的。再仔細觀察兩個碼表,我們會發現編碼都是有區間的。這樣就沒有包含常用的ASCII碼。對於ASCII碼的處理就放在了 encode和decode函數中完成了。 對於decode函數要復雜一些。它主要是解決如何判斷一個字符串中的字符是漢字還是英文。最簡單的判斷就是當字符值小於0x80時,表示是英文字符,字符長度為1。否則為中文,字符長度為2。然後去解碼對照表中查找Unicode編碼值。 於是根據以上的理解,我將原有的多個文件合並成了一個文件。原文件中還實現了StreamWriter和StreamReader兩個類,但我看到許多轉碼器都沒有內容,於是我也把它給忽略了。這樣,我將encode和decode函數保存下來,只保留解碼對照表(decoding_map)。編碼對照表仿照別的轉碼器用程序生成。最後生成的文件名為gb2312.py。 把改好的gb2312.py文件拷貝到python/lib/encodings目錄下。再測試前面對GB2312編碼進行測試的例子,這次成功了! Plone的GB2312編碼的實現 將gb2312.py拷貝到Zope安裝目錄下的bin/lib/encodeings目錄下。重啟Zope。將Localizer中 messagecatalog(本例為Plone)組件的語言改成GB2312。再執行Import功能。這次沒有報錯。再把Plone的語言設置為 GB2312。在浏覽器中看一看,可以了吧。 相關鏈接 gb2312.py(gb2312.zip) GB2312編碼的中文翻譯文件(plone-zh-cn-gb2312.zip)



GB2312編碼的中文翻譯文件(plone-zh-cn-gb2312.zip)



Copyright © Linux教程網 All Rights Reserved