国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

Linux 國際化本地化和中文化

2024-08-28 00:00:18
字體:
供稿:網(wǎng)友
一 國際化、本地化和中文化
  • 國際化、本地化和多語言化的概念

    一般來說, "國際化"是指把原來為英文設(shè)計的計算機系統(tǒng)或應(yīng)用
    軟件改寫為同時支持多種語言和文化習俗的過程. 在軟件創(chuàng)作的初期,
    一般的編程語言,編譯,開發(fā)都是盡支持英文的, 為了適應(yīng)更廣的語言
    和文化習俗, 軟件有必要在設(shè)計結(jié)構(gòu)和機制上支持多語言的擴展特性,
    這一過程稱為國際化. 國際化僅僅是在軟件設(shè)計上提供了使用多語
    言的可能.

    "本地化"是指把計算機系統(tǒng)或者應(yīng)用軟件轉(zhuǎn)變?yōu)槭褂貌⒓嫒菽撤N
    特定語言的過程. 比如, 把原來為英文設(shè)計軟件制作為支持中文的軟
    件就是本地化的一種. 它主要包括翻譯文本信息,界面信息,重新設(shè)計
    圖標等等.

    語言和文化習俗因地域不同而差別很大. 對某一特定的地域的
    語言環(huán)境稱為"locale". 它不僅包括語言和貨幣單位, 而且還包括
    數(shù)字標示格式, 日期和時間格式. 國際化了的軟件含有一個"locale"
    的"參量", 使用該"locale"參量便可以設(shè)置某一區(qū)域所用的語言環(huán)境.

    在國際化部分中只處理語言的部分叫"多語言化". 比如, 一個
    "多語言化"的軟件可以同時管理諸如英語,法語,中日韓文, 阿拉伯語等.

    在英文中, 國際化(Internationalization)被縮寫為I18N, 即只
    取首尾兩個字母, 中間字母為18個. 同樣地, 本地化(Localization)
    縮寫為L10N, 多語言化(Multilingualization) 縮寫為M17N.


    在今天, Internet把世界各地的計算機聯(lián)接了起來, 共享信息和
    技術(shù)是必然的趨勢和需要. 因此各地的計算機系統(tǒng)可以互相交流變得
    越來越重要. 在Linux系統(tǒng)向桌面普及的過程中, Linux軟件也需要國
    際化和本地化.


  • 中文化

    "中文化"是一個很模糊的概念. 在Linux上的"中文化"它既包含使
    軟件或系統(tǒng)國際化,又包含使軟件本地化. 也就是說, "中文化"不僅僅
    是只把軟件本地化這么簡單的事情, 更重要的是因為Linux直接支持中
    文的軟件太少, 做"中文化"必須先做"國際化".

    由于歷史的原因, 現(xiàn)階段使用的中文又有簡體中文和繁體中文之
    分. 所使用的編碼也不同. 支持中文的軟件應(yīng)該同時支持簡體中文和
    繁體中文, 這對軟件的國際化提出了更高的要求.

    1999年是中國Linux發(fā)展和普及過程中最重要的一年, 其中涌現(xiàn)了
    許多制作中文Linux發(fā)布版本的公司. 中文Linux的技術(shù)都是采取了中文
    化的捷徑----中文平臺. 盡管都是中文平臺, 但是具體實現(xiàn)的技術(shù)特點
    各不相同. 充分展示了中文平臺在Linux中文化過程中的魅力. 中文平臺
    在短期內(nèi)發(fā)揮了巨大的作用, 加速Linux的中文化過程并推動Linux在中
    國的普及.


    中文平臺的主要技術(shù)特點是不用修改西文應(yīng)用軟件, 便可以顯示和
    輸入中文(有的情況下會失效). 具體地說, 就是利用自己的規(guī)范去修改
    X系統(tǒng)的底層函數(shù). 從修改的層次上分為(1)修改函數(shù)庫libX11.so, 這種
    方式是動態(tài)修改, 又稱外掛方式. 外掛方式的實現(xiàn)可以是直接修改X11庫
    或使用LD_PRELOAD載入動態(tài)庫修改. (2)修改X Server部分, 又稱內(nèi)嵌方式,
    它的實現(xiàn)也分為兩種, 直接修改X Server部分和建立虛擬Display(X傳輸
    協(xié)議的部分代理).


  • X11 國際化的歷史和級別

    早期的X11R4版本中, 僅僅含有支持單字節(jié)和雙字節(jié)字體的函數(shù),
    所以它不能算是國際化的函數(shù)庫. 此后, 一個叫做"mltalk"的X協(xié)會
    成立并著手研究X窗口系統(tǒng)的國際化問題. 眾多的X窗口系統(tǒng)供應(yīng)商也
    參與了該組織. 因為對國際化的研究剛剛開始, 所以mltalk提出的了
    一個基本問題: 什么是X窗口系統(tǒng)的國際化? 對它的解釋也各不相同.
    實際上, 即使是現(xiàn)在, 人們對國際化的定義仍然存在分歧, 分歧的焦點
    主要集中于對軟件或系統(tǒng)怎樣程度的國際化才算是真正的國際化.

    按國際化的級別來分, 下列幾種情況都屬于國際化:


  • 語言可以切換. 在系統(tǒng)啟動時可以設(shè)置某種語言
  • 使用不同語言的軟件可以同時使用, 在應(yīng)用軟件啟動時可以
    設(shè)置某種語言
  • 使用不同語言的軟件可以同時使用, 而且應(yīng)用軟件的語言可
    以動態(tài)切換
  • 使用不同語言的軟件可以同時使用, 而且在應(yīng)用軟件中可以
    同時使用不同語言


    顯然, 第(4)種國際化方式是最完善的方式, 其次是第(3)種,第(2)種
    和第(1)種. mltalk 最終決定使用第(3)種, 原因是需要支持第(4)種的
    X窗口系統(tǒng)供應(yīng)商是少數(shù)的. 從目前Linux上的國際化情況看, 支持第(2),
    (3)種的國際化軟件是最常見的, 但是第(4)種軟件比較少見, 而且應(yīng)用的
    意義不是很大.

    基于上述觀點, X11R5 的目的是, 創(chuàng)建支持不用重新編譯源代碼
    就可以適應(yīng)于語言環(huán)境的應(yīng)用軟件開發(fā)平臺. 確切地說, 就是國際化
    的結(jié)構(gòu)是基于標準C函數(shù)setlocale的. X11R5 確立了以下規(guī)范:


  • 切換語言的機制
  • 與語言無關(guān)的輸出接口
  • 與語言無關(guān)的輸入接口
  • 資源文件的國際化
  • X工具(Xt)的國際化


    此后, 以X11R5 為基礎(chǔ), OSF/Motif 完成了國際化改造, 并且成為
    被用戶廣泛接受的高層圖形軟件庫, 直到今天, 一些大型的軟件仍然使用
    Motif 作為基礎(chǔ)庫使用, 如Java, Netscape等. X11R5的規(guī)范在制定的同時,
    為了檢測規(guī)范的實用性, 開發(fā)了兩套樣本應(yīng)用, 即 Xsi 和 Ximp. 兩套應(yīng)用
    在輸入?yún)f(xié)議上和對locale的支持上都不同, 從而為開發(fā)商帶來了不便.

    X11R6 解決了X11R5中存在的問題, 主要的變化有,


  • 定義了標準的輸入?yún)f(xié)議
  • Locale數(shù)據(jù)格式定義
  • 只采用了一種國際化工具的樣本應(yīng)用模塊


    在輸出上, X11R6增加了從由到左的的書寫方式, 以支持阿拉伯語和
    希伯來語等, 增加了從上到下的書寫方式, 以支持中文和日文等的書寫.


  • 國際化標準組織

    這里所說的國際化標準是國際化標準組織或一些相關(guān)組織制定的一些標準,
    而且這些標準也會隨時間不同而經(jīng)常更新. 國際化標準涉及到字符集,編碼,
    字體處理,打印,文本繪制, 用戶界面, 語言輸入方法, 數(shù)據(jù)交換, 文化習俗,
    等方方面面.

    下面列出一些制定國際化標準的組織:


    • Li18nux(Linux I18n)
    • ANSI(American National Standards Institute)
    • POSIX(Portable Operating System Interface for Computer
      Environments)
    • ISO(International Standards Organization)
    • IEEE(Institute of Electrical and Electronics
      Engineers)
    • Unicode Consortium
    • Open Group(X Consortium and OSF)
    • X/Open and XPG


    其中, ANSI/ISO 制定了使用C編程語言編寫國際化軟件的通用接口. ISO
    制定了字符集標準和其它影響locale名字的標準. IEEE提供了一些國際化的
    通用庫函數(shù)和設(shè)置管理不同locale的用戶命令. Open Group是Unix和X窗口
    系統(tǒng)的國際化標準設(shè)立組織. Li18nux 是一個專門從事Linux上的軟件國際化
    規(guī)范制定的組織.


  • 國際化的意義

    國際化, 特別是國際化中制定的標準, 是當今開發(fā)國際化軟件所必須
    的. 它也是軟件開發(fā)的必然趨勢. 遵循國際化標準, 可以更高效地開發(fā)和
    調(diào)試軟件和移植軟件, 降低軟件的開發(fā)費用, 使用戶更方便地使用軟件.
    從國際環(huán)境來看, 新開發(fā)的基本的庫函數(shù)都會支持國際化標準, 基于這些
    函數(shù)庫所開發(fā)的應(yīng)用軟件理所當然地支持國際化標準, 同時有大批的Linux
    愛好者把以前不符合國際化標準的軟件進行了改造, 使它們在一定程度上
    符合國際化標準. 使用國際化標準的軟件, 淘汰非國際化標準的軟件成為
    一種趨勢.

    從國際化的發(fā)展歷史看, 其中許多標準都有日本的商業(yè)機構(gòu)參與, 支持
    日文的軟件變得越來越多, 而從日語軟件移植為中文軟件相對于直接移植
    西文軟件相當容易, 有時甚至不用改動, 這樣就節(jié)省了許多不必要的勞動.
    反過來, 符合國際化標準的中文軟件又影響日語和韓語軟件, 成滾雪球之
    勢向前發(fā)展. 其次, 軟件商的開發(fā)比較看好亞洲市場中的日本市場, 在
    Unix/Linux上的日語軟件或操作系統(tǒng)一般是符合國際化標準的, 所以兼容
    這一標準是十分必要的. 當然, 目前的國際化標準也存在不足之處, 特別是
    對中文這一特殊語言(因為含有GB和Big5兩種不能共存的編碼)的處理上,
    應(yīng)該由中國人在原來的基礎(chǔ)上作相應(yīng)的擴展.

    對中文Linux來說, 遵循國際化也是必然的趨勢. 在以中文平臺為基礎(chǔ)
    的中文Linux上, 軟件移植已成為必須解決的問題, 這個問題的最終解決
    方法就是遵循同一標準, 就目前來說遵循國際化標準是唯一的方法. 鑒于
    目前中文Linux上的中文平臺的混亂狀態(tài), 國際化標準是從無序到有序過渡
    的必然途徑.

    軟件的國際標準化也為最終用戶帶來極大的好處, 如同時支持簡體中文
    和繁體中文, 中文操作為雙字節(jié)操作, 中文輸入能夠在更大的程度上使用
    標準輸入接口帶來的好處, 如輸入服務(wù)器的定位等交互式操作.

    國際化的另一個特點是工作在應(yīng)用軟件級別, 所以國際化不會給X窗口
    系統(tǒng)帶來不穩(wěn)定性.


  • 參考資料:
    • Linux I18N: http://www.li18nux.org/

    二 Locale
  • Locale 的概念

    Locale 是ANSI C語言中最基本的支持國際化的標志, 對中文Linux來說,
    如果它支持國際化, 那么支持中文Locale是最基本的要求.

    Locale 是軟件在運行時的語言環(huán)境, 它包括語言(Language), 地域
    (Territory) 和字符集(Codeset). 其格式為: 語言[_地域[.字符集]].
    如對中文GBK字符集, locale的格式是:zh_CN.GBK. 目前Linux上的中文
    Locale還不完善, glibc2.1.x中的許多涉及Locale的C函數(shù)還不正確. 如果
    用戶需要安裝中文GBK Locale, 可以直接使用TLC6.0中的:


    • glibc-2.1.2(含有GBK模塊)
    • localedata-zh-0.07
    • /usr/X11R6/lib/X11/locale/zh_CN.GBK/XLC_LOCALE(X 下的
      GBK Locale)


    Locale 包含了以下分類:


  • LC_COLLATE, 用于比較和排序. 排序?qū)χ形膩碚f也比較重要,
    但是現(xiàn)在的glibc中的locale對中文支持有些問題. 漢字排序的
    的方式有許多種, 按照發(fā)音(漢語拼音)或者漢字筆畫來排序
    是比較容易被接受的.
  • LC_CTYPE, 用于字符分類
  • LC_MONETORY, 用于貨幣單位
  • LC_NUMERIC, 用于數(shù)字顯示格式. 下面是不同國家的在貨幣符號
    和數(shù)字格式上的不同:


    • 中國大陸: 1,234.56RMB
    • 美國: $1,234.56
    • 德國: 1.234,56DM

  • LC_TIME, 用于時間和日期. 時間可以用12小時或者24小時的
    格式來計算. 在小時和分鐘之間可以用逗點或者冒號隔開. 下面
    是一些Locale設(shè)置的時間和日期的格式:


    • 中國: 14點20分 2000年三月十四號
    • 英國: 02:20pm 14/03/2000
    • 美國: 02:20pm 03/14/2000
    • 芬蘭: 14.20 14.03.2000



  • LC_MESSAGES, 用于國際化信息, 主要是提示信息,錯誤信息,
    狀態(tài)信息, 標題, 標簽, 按鈕和菜單等.


    Locale 通過ANSI C 函數(shù)setlocale(分類, locale)來初始化locale
    數(shù)據(jù). 當locale設(shè)置為空時, locale的值便從系統(tǒng)的環(huán)境變量中取得. 為了
    方便應(yīng)用軟件, 設(shè)置所有的分類, 可以采用下述方式:


    setlocale(LC_ALL, "");

    如果不成功, 該函數(shù)返回NULL. 函數(shù)應(yīng)該回落到setlocale(LC_ALL,"C").


  • 在X中使用Locale

    在X的客戶程序中使用Locale的機制和在標準C函數(shù)中使用Locale的方式一樣,
    除此之外, 在X庫中還定義了另外兩個函數(shù)來判斷X的locale支持和設(shè)置locale
    的修飾(XModifier), 在X中使用Locale和libX11的基本步驟如下:


    • setlocale(): 設(shè)置當前的locale
    • XSupportLocale(): 用來判斷X是否支持目前設(shè)置的locale.
    • XSetLocaleModifier(): 它用來指定一系列的locale修正值.
      它的參量的格式是@分類=賦值. 目前唯一可用的是輸入
      服務(wù)器的名稱"im". 如果參量為空, 則根據(jù)系統(tǒng)的環(huán)境
      變量XMODIFIERS查找. 比如在系統(tǒng)上設(shè)置了環(huán)境變量:

      % setenv XMODIFIERS @im=Chinput (csh) 或
      % export XMODIFIERS=im=Chinput (bash)

      則客戶程序?qū)⒉檎业捷斎敕?wù)器Chinput, "Chinput"是
      輸入服務(wù)器所設(shè)置的名稱.





  • 文化習俗的差別

    下面是在國際化和本地化過程中常常遇到的并且應(yīng)當注意的地方, 對國際化
    軟件的開發(fā), 應(yīng)該充分注意到各個地域的文化和習慣, 開發(fā)出通用的軟件,
    對于本地化過程, 則應(yīng)選擇與本地域相符的習慣.


    • 姓名,地址等特殊信息

      姓名中的"姓"和"名"的先后次序, 地址書寫的先后次序
      電話號碼的長度等等
    • 圖標的通用性

      圖標是易于接受的用戶界面, 設(shè)計時應(yīng)考慮到地域習慣,
      而且圖標上不能有圖形文字, 否則需要重新設(shè)計本地圖標,
      并翻譯圖標上的文字.
    • 聲音使用

      不適當?shù)穆曇艋蛱崾究赡軙鹑说姆锤? 另外, 聲音
      的性別對某些國家是敏感的.
    • 顏色使用

      顏色和色調(diào)與民俗有關(guān), 比如紅色在美國表示危險, 在中國
      表示喜慶.
    • 紙張尺寸

      打印紙的尺寸因地域而不同, 在選擇缺省尺寸時應(yīng)注意.
    • 鍵盤差別

      在鍵盤上的鍵可能因國家而異, 鍵的個數(shù)也可能不一樣.
    • 政治因素

      在產(chǎn)品設(shè)計上, 盡量不要有政治敏感性部分.



  • 參考資料:


    • Linux 上的Locale
      http://www.ping.be/linux/locales/index.shtml
    • GBK Locale
      ftp://ftp.turbolinux.com.cn/pub/turbolinux/TurboLinuxC-6.0/SRPMS/SRPMS/localedata-zh-0.07-1.src.rpm


    三 X 窗口系統(tǒng)的國際化
    在 X 窗口系統(tǒng)上的國際化, 特別是中文化, 主要體現(xiàn)在顯示,輸入和打印三個方面.
  • 顯示的國際化


  • 字符集和編碼

    在Linux上經(jīng)常使用的字符集是ISO 8859系列的字符集. 它包含了10個
    多語言的單字節(jié)編碼字符集. 它們分別是,



    字符集
    涵蓋語言


    ISO 8859-1(Latin1)
    拉丁一字符集, 包含絕大多數(shù)的歐洲語言, 例如French(fr),
    Spanish (es), Catalan (ca), Basque (eu), Portuguese (pt),
    Italian (it), Albanian (sq), Rhaeto-Romanic (rm),
    Dutch (nl), German (de), Danish (da), Swedish (sv),
    Norwegian (no), Finnish (fi), Faroese (fo), Icelandic (is),
    Irish (ga), Scottish (gd), English (en), Afrikaans (af)
    和 Swahili (sw). 影響了美洲, 澳洲和非洲.



    ISO 8859-2(Latin2)
    拉丁二字符集, 包含了中歐和東歐的語言:Czech (cs),
    Hungarian (hu), Polish (pl), Romanian (ro), Croatian (hr),
    Slovak (sk), Slovenian (sl), Sorbian.



    ISO 8859-3(Latin3)
    拉丁三字符集, 包括: Esperanto (eo) and Maltese (mt)


    ISO 8859-4(Latin4)
    拉丁四字符集, 包括: Estonian (et), 巴爾地克 Latvian (lv)
    和 Lithuanian (lt), Greenlandic (kl) , Lappish.


    ISO 8859-5(西里爾語)
    Bulgarian (bg), Byelorussian (be), Macedonian (mk),
    Russian (ru), Serbian (sr)


    ISO 8859-6(阿拉伯語) 阿拉伯語(ar)
    ISO 8859-7(希臘語)希臘語(el)
    ISO 8859-8(希伯來語)Hebrew (iw) 和Yiddish (ji)
    ISO 8859-9(Latin5)
    重排了Latin1, 用土耳其語的幾個字母做了替換
    ISO 8859-9(Latin6)
    重排了Latin4, 去掉了某些符號, 增加了Inuit等
    ISO 8859-11(泰國語)泰國語(th)
    ISO 8859-12Celtic
    ISO 8859-13(Latin7)
    Baltic Rim 和 Lativian(lv)
    ISO 8859-14(Latin8)
    Gaelic 和 Welsh (cy)
    ISO 8859-15(Latin9)
    Latin1的變種, 修改了某些字母



    雙字節(jié)字符集主要包含中文,日文和韓文. 它由前導(dǎo)字節(jié)(Lead Byte)
    和尾部字節(jié)(Trail Byte)構(gòu)成, 由于一個字符采用了兩個字節(jié), 在軟件的
    國際化方面又增加了一些麻煩, 比如在顯示上, 光標的位置不能位于漢字
    之間, 刪除和移動時必須是整字操作等, 在輸入上, 一般需要預(yù)編輯服務(wù)器
    才能輸入漢字. 下表列出了中日韓語言編碼的有關(guān)信息:




    語言
    字符集
    代碼頁
    前導(dǎo)字節(jié)范圍
    尾部字節(jié)范圍


    簡體中文
    GB2312-1980
    CP936
    0xA1-0xF7
    0xA1-0xFE


    GBK

    0x81-0xFE
    0x40-0x7E, 0x80-0xFE


    中文繁體
    BIG-5
    CP950
    0x81-0xFE
    0x40-0x7E, 0xA1-0xFE


    日文
    Shift-JIS
    CP932
    0x81-0x9F, 0xE0-0xFC
    0x40-0xFC(0x7F除外)


    韓文
    KSC-5601-1987
    CP949
    0x81-0xFE
    0x41-0x5A,0x61-0x7A,0x81-0xFE


    KSC-5601-1992
    CP1361
    0x84-0xD3
    0xD8
    0xD90-0xDE
    0xE0-0xF9
    0x41,0xFE
    0x41-0x7E
    0x81-0xFE
    0x31-0x7E





    最近, 信息產(chǎn)業(yè)部和國家質(zhì)量技術(shù)監(jiān)督局聯(lián)合發(fā)布了兩項新的中文信息
    處理基礎(chǔ)性國家標準,為解決偏、生漢字的輸入提供了方案。其中GB18030-
    2000《信息技術(shù)和信息交換用漢字編碼字符集、基本集的擴充》,為強制性
    國家標準. 它收錄了2.7萬多個漢字,總編碼空間超過150萬個碼位,為徹底
    解決郵政、戶政、金融、 地理信息系統(tǒng)等迫切需要的人名、地名用字問題
    提供了解決方案,也為漢字研究、古籍整理等領(lǐng)域提供了統(tǒng)一的信息平臺基礎(chǔ)。
    這項標準還同時收錄了藏文、蒙文、維吾爾文等主要的少數(shù)民族文字. 字符
    集編碼范圍是:



    字節(jié)數(shù)編碼空間碼位數(shù)目
    單字節(jié)0x00-0x80129
    雙字節(jié)第一字節(jié):0x81-0xFE
    第二字節(jié):0x40-0x7E,0x80-0xFE23940
    四字節(jié)四字節(jié)范圍分別是:
    0x80-0xFE,0x30-0x39,0x81-0xFE,0x30-0x391587600




    香港特別行政區(qū)也對Big5編碼提出了"香港增補字符集", 其目的,是
    收納香港特區(qū)政府及市民在中文電子通訊中有需要使用的字符,來補充目前
    大五碼和ISO10646編碼標準內(nèi)并未包含的字符,以作為一個通用的中文界面,
    方便大家能準確地以中文進行電子通訊。香港增補字符集有兩套編碼方案,
    一套適用於大五碼系統(tǒng),另一套適用於ISO10646平臺。香港增補字符集的大
    五碼版本,實際上是政府通用字庫的增訂版。ISO10646國際編碼標準目前并
    未包含香港增補字符集內(nèi)的所有字符。目前尚未收納在ISO10646內(nèi)的香港增
    補字符集字符,均已提交國際標準化組織管轄下的表意文字小組,以考慮是
    否納入ISO10646日后的新增版本內(nèi).

    上述標準和草案應(yīng)該是以后的中文Linux所應(yīng)該遵循的.


  • 多字節(jié)字符(Multibyte)和寬字符(WideChar)的使用

    我們平時見到的以文本方式存在的字符都是多字節(jié)字符, 它主要用于
    文件存儲和網(wǎng)絡(luò)上的以流(Stream)的方式傳輸. 一個GB編碼的漢字需要兩個
    字節(jié). 多字節(jié)字符的缺點是在中文處理上不方便, 比如漢字的刪除和光標的
    移動都會有半漢字問題. 為了文本處理的方便, 在內(nèi)部操作上通常是把漢字
    與英文的混和字符串先轉(zhuǎn)換成等寬度的字符串, 即寬字符, 為軟件的內(nèi)部處理
    提供方便.

    glibc2.1.x中多字節(jié)字符串和寬字符串的轉(zhuǎn)換有時有問題. 在X下還可以
    使用另外一種方式完成轉(zhuǎn)換, 即使用XmbTextListToTextProperty()和
    XwcTextPropertyToTextList() 聯(lián)合完成轉(zhuǎn)換.


  • Unicode

    目前所使用的Unicode 是一種16位字寬的字符編碼, 它由非贏利的計算機
    組織Unicode研討會維護和改進. 它起源于Xerox和Apple之間的合作研究. 幾
    個公司組成了一個非正式的論壇, 接著IBM, Microsoft等公司迅速加入.
    Unicode研討會在1990年發(fā)表了Unicode標準版本1, 同時國際標準化組織完成
    了一種類似的編碼----ISO 10646. 因為沒有必要存在兩套標準, 所以Unicode
    研討會和國際標準化組織在1991到1992合二為一. 1994年, 中國和日本開始對
    基于ISO10646上的國家標準進行工作. 現(xiàn)在, Unicode 開始用在許多產(chǎn)品中.

    Unicode包含了當今計算機領(lǐng)域中廣泛使用的所由字符, 如世界上大部分
    的書面語言, 印刷字符, 數(shù)字和技術(shù)符號, 地理圖形和標點符號. 由于Unicode
    的一致性, 它在大多數(shù)情況下都可能簡化軟件的國際化過程. 它取消了處理
    多種代碼頁的必要, 并且由于是16位編碼, 因此由雙字節(jié)字符集所引起的額外
    處理也不必要了.

    但是, Unicode作為一種編碼也有它的缺陷, 比如編碼的位置與排序無關(guān),
    所以使軟件支持Unicode僅僅是國際化的第一步, 實際情況中還需要與語言相關(guān)
    的信息和規(guī)則. 所以Unicode一般作為程序的內(nèi)部處理編碼, 必須提供與其它
    編碼的雙向轉(zhuǎn)換表.

    最后需要說明的是, 雖然使用Unicode會使普通的英文文本大兩倍, 但是
    使用Unicode的整個系統(tǒng)卻不會增加太大, 因為系統(tǒng)存放的文件大部分是二進制
    文件格式, 同時, 使用針對Unicode的壓縮方式, 可以把文件壓縮成和使用對應(yīng)
    的8位正文一樣大小.


  • 字體(Font)和字體集(FontSet)

    在X窗口系統(tǒng)下使用的字體都必須在X服務(wù)器中注冊X邏輯字體描述(X Logical
    Font Description)名. 它包括了字體的許多信息, 例如以下為西文字體和中文
    字體的兩個例子.


  • -adobe-times-medium-r-normal--14-140-75-75-p-74-iso8859-1
  • -*-song-medium-r-normal--24-*-gb2312.1980-0


    為了方便使用, 用戶還可以給每一個字體加一個或多個別名, 別名文件
    fonts.alias 放在字體目錄下, 可以手工編輯. 當字體目錄變更或別名變更
    后, 必須使用命令 "xset fp rehash"或重新啟動X才起作用.

    X 字體也可以通過字體服務(wù)器(Font Server)加載. 這對于本地不放字體
    的系統(tǒng)或X終端特別有用. 加載的協(xié)議可以是TCP或DECNET.

    X 窗口系統(tǒng)的字體在X Server中之存在一份, 當所由軟件都不使用它時,
    字體的內(nèi)存自動施放.

    字體中包含了制造商名, 字體類型, 權(quán)重, 字體大小, 字符集等信息. 它們也
    可以縮寫, 省去的部分用星號代替, 比如對上面的中文字體, 可以縮寫為:


    -*-song-*-24-*-gbk-0

    在實際應(yīng)用中, 字符串往往是中文和英文的混和字符串, 所以必須使用兩種
    字體來繪出該字符串, 這種指定兩種或兩種以上的字體的描述就是字體集. 字體
    集一般的格式是把多種字體用逗號隔開, 比如, 指定下列字體集:


    "-adobe-helvetica-medium-r-normal--14-*-*-*-*-*-iso8859-*,/
    -*-song-medium-r-normal--14-*-*-*-*-*-gb2312.1980-0"

    令人遺憾的是, 中文的GB編碼和Big5編碼有重疊區(qū)域, 不能區(qū)分開來, 所以
    字體集并不能同時指定GB和Big5的字體.

    字體集的具體載入受到Locale的影響.

    在許多已經(jīng)國際化的軟件和圖形庫中, 一般通過資源文件讓用戶指定字體集,
    比如gtk的簡體中文資源文件為/etc/gtk/gtkrc.zh_CN, qt-1.44(國際化的)的
    資源文件是 ~/.qti18nrc 等等.


  • 信息的國際化

    信息(Message)國際化是軟件國際化中比較重要的一環(huán), 如果使軟件可以
    支持多種語言, 在設(shè)計時就應(yīng)當考慮到信息的國際化問題. 現(xiàn)在的絕大多數(shù)
    軟件使用GNU的gettext作為基本工具. 信息國際化的基本步驟是:

    • 在軟件初始化時設(shè)置使用setlocale()設(shè)置Locale
    • 使用gettext宏定義, 使程序看上去比較方便:
    • 指定信息的位置:
    • 指定翻譯信息: _("Some Strings");
    • 在軟件完成后,使用 xgettext 提取信息并翻譯
    • 使用msgfmt把信息文件轉(zhuǎn)換為.mo文件, 安裝到locale目錄下


    /* file this_app.c */
    #include
    #include
    #define _(String) gettext(String)
    #define N_(String) gettext(String)
    #define __(String) (String)
    int main(){
    //由環(huán)境變量決定locale
    setlocale(LC_ALL, "");
    //設(shè)置message的位置和文件名
    bindtextdomain("this_app", "/usr/share/locale");
    textdomain("this_app");

    printf(_("Some String"));
    }

    至此, 本程序的國際化過程已完成. 編譯并聯(lián)接成可執(zhí)行文件this_app.

    gcc -o this_app this_app.c
    下面是本地化的過程.

    • 提取要翻譯的信息: xgettext -a -o this_app.po this_app.c
    • 翻譯信息
      在文件this_app.po 中含有"Some String":

      msgid "Some String"
      msgstr ""
      翻譯成:

      msgid "Some String"
      msgstr "一些字符串"

    • 格式化信息文件: msgfmt -o this_app.mo this_app.po
    • 拷貝信息文件到locale的目錄下, 比如對于中文zh_CN,
      cp this_app.mo /usr/share/locale/zh_CN/LC_MESSAGES
    • 執(zhí)行文件: LC_ALL=zh_CN ./this_app




  • 輸入的國際化

    在X窗口系統(tǒng)下輸入主要有三種方式:


  • 單此擊鍵輸入單字符
  • 兩個或多個組合鍵輸入單字符
  • 除鍵輸入外, 還需要轉(zhuǎn)換服務(wù)器


    其中前兩種用于輸入西文字符, 比如對于歐洲語言的特殊字符的輸入,
    通常采用重映射鍵盤的方法. 或者使用"加速鍵"的方法輸入, 加速鍵是鍵盤
    上的特殊鍵, 按下后不會使光標向后移動.

    在Linux下, 使用軟件xkeycaps可以把鍵盤重新映射并且保存整個鍵盤
    在映射后的對照表, 使用命令xmodmap可以加載映射表.

    對于中文輸入, 主要使用第三種輸入方式. 針對各種語言的綜合考慮,
    X 窗口系統(tǒng)在輸入上定義了下列區(qū)域:


  • 預(yù)編輯區(qū)域(Preedit Area), 用于顯示輸入的過程, 當用戶輸入
    字符時, 應(yīng)立即顯示在該區(qū)域
  • 狀態(tài)區(qū)域(Status Area), 用于顯示輸入狀態(tài), 對中文來說,
    用于顯示輸入方法, 全角/半角狀態(tài), 中文/西文標點符號狀態(tài).
  • 輔助區(qū)域(Auxiliary Area), 顯示可供選擇的列表, 又稱選擇
    區(qū)域, 它由輸入服務(wù)器控制.


    根據(jù)預(yù)編輯區(qū)域和狀態(tài)區(qū)域的不同組合, X 窗口系統(tǒng)共定義了四種輸入
    的風格(Input Style):


  • Root風格: 預(yù)編輯區(qū)域和選擇區(qū)域都在應(yīng)用軟件之外, 它們都是
    由輸入服務(wù)器完成的, 輸入服務(wù)器所顯示的界面是根窗口的子
    窗口. 如類似"中文之星"的獨立的輸入條模式.
  • OffTheSpot風格: 預(yù)編輯區(qū)域和選擇區(qū)域在應(yīng)用軟件之內(nèi), 通常
    是在窗口下方的某個固定區(qū)域內(nèi). 如XEmacs的缺省輸入模式.
  • OverTheSpot風格: 預(yù)編輯區(qū)域在當前的輸入位置, 狀態(tài)區(qū)域
    在應(yīng)用程序的某一固定區(qū)域. 它通常又稱為光標跟隨模式, 類似
    于Windows下的智能ABC輸入方法
  • OnTheSpot風格: 預(yù)編輯區(qū)域和選擇區(qū)域都在應(yīng)用軟件之內(nèi),
    內(nèi)容是又輸入服務(wù)器發(fā)送的, 應(yīng)用程序負責顯示.


    對中文輸入來說, 最好的風格是(3),(4),(1). 對大部分中文輸入方法,
    必須彈出輔助區(qū)域, 供用戶選擇, 只有少數(shù)的中文輸入方法, 如五筆字型,
    比較適合(4). 對于狀態(tài)區(qū)域, 中文輸入多數(shù)選用在Root風格的窗口的某個
    位置或使用專用的控制條. 在MS Windows下比較常用的光標跟隨模式, 可以
    用(3),(4)來實現(xiàn). 鑒于Linux下有的用戶把X Window設(shè)置成為虛屏模式, 選
    擇上述的任何一種模式都不盡滿意.

    對應(yīng)用軟件來說, 最簡單的輸入接口是Root風格, 它把顯示部分交給
    輸入服務(wù)器去做. 編寫軟件時所用的代碼量少, 是對軟件初步使用國際化
    標準的最佳選擇. 從方便用戶的角度來看, 應(yīng)用軟件, 特別是高層的庫函數(shù)
    應(yīng)該同時支持四種輸入風格. 令人遺憾的是, 一般軟件僅支持兩到三種輸入
    風格. 所以在現(xiàn)在的輸入服務(wù)器(IM Server)也很少支持四種風格, 這似乎
    成了雞和蛋的問題.

    下面列出幾種常用軟件和圖形庫的XIM支持情況:



    NetscapeRoot,OffTheSpot,OverTheSpot
    Java Root,OnTheSpot
    Qt Root,OverTheSpot
    gtk+ Root,OverTheSpot
    rxvt Root,OffTheSpot,OverTheSpot



    中文輸入需要客戶軟件和服務(wù)器軟件的的密切配合, 它們之間是通過
    XIM(X Input Method)協(xié)議來通訊的. 輸入服務(wù)器首先起動, 在X Server里
    注冊自己, 服務(wù)器的名字也被注冊. 當客戶程序起動時, 到X Server里查尋
    有沒有符合自己locale類型的輸入服務(wù)器(如果用XMODIFIERS指定服務(wù)器名,
    則同時用locale和名字區(qū)分). 找到后, 根據(jù)輸入服務(wù)器提供的風格種類
    選擇一個最適合自己的風格. 然后客戶程序為每一個需要輸入的窗口都建立
    一個自己的標示IC(Input Context), 里面含有客戶程序的信息, 以后的通訊
    則一直使用該標示.

    下面是直接使用X Lib和服務(wù)器聯(lián)接的過程, 在高層函數(shù)庫中, 把這一
    過程隱藏了起來:


    XIM im;
    XIC ic;
    ...
    if( (im = XOpenIM(display, NULL, NULL, NULL)) == NULL ) {
    printf("Error : XOpenIM !/n");
    exit(0);
    }
    //指定預(yù)編輯的類型等...
    if( (ic = XCreateIC(im,
    XNInputStyle, XIMPreeditPosition | XIMStatusNothing,
    XNClientWindow, window,
    NULL)) == NULL ) {
    printf("Error : XCreateIC() ! /n");
    XCloseIM(im);
    exit(0);
    }
    ...
    for(;;) {
    XNextEvent(display, &event);
    //如果輸入服務(wù)器接收并處理...繼續(xù)
    if (XFilterEvent(&event, None) == True)
    continue;
    switch(event.type) {
    case Expose:
    XmbDrawString(...);
    case KeyPress:
    count = XmbLookupString(ic,
    (XKeyPressedEvent *) &event,
    string, len, &keysym, &status);
    ...
    }
    }


    目前使用比較廣泛的XIM輸入服務(wù)器有Chinput(簡體中文, 同時支持繁體),
    xcin(繁體中文), kinput2(日文) 和 hanIM/ami(韓文).

    中文輸入服務(wù)器Chinput 選擇了OverTheSpot風格作為缺省的輸入模式,
    它與標準的輸入風格略有不同, 即把預(yù)編輯區(qū)域偏離輸入位置, 使輸入?yún)^(qū)
    域同時作為狀態(tài)區(qū)域, 在很大程度滿足了用戶的輸入習慣. 同時它還使用
    輔助工具條顯示和改變輸入狀態(tài). Chinput還解決了同時使用GB和Big5編碼
    的問題, 被動輸入(Passive Input)問題等. 對于普通用戶, 除了使用鍵盤
    輸入外, 還可以使用手寫識別輸入和語音識別輸入方式. 目前的輸入架構(gòu)
    基本能夠滿足它們的要求. 筆者在手寫識別輸入方面做了一些嘗試, 發(fā)
    現(xiàn)對絕大部分軟件是能夠適合被動輸入的.


  • 打印的國際化

    在X窗口系統(tǒng)下的打印是一個很難解決的問題, 所以到目前為止沒有形成
    一個統(tǒng)一的打印標準. 其原因之一就是X窗口系統(tǒng)在設(shè)計上把顯示和打印完全
    分開了.

    在Linux最常見的需要打印的文件格式是普通文本文件和PostScript文件.
    對于中文的普通文本文件的打印一般需要先轉(zhuǎn)換為PostScript文件再打印.
    對于PostScript文件, 如果應(yīng)用軟件在生成時含有中文字體信息, 則打印
    比較容易實現(xiàn), 反之, 則很難實現(xiàn)甚至不可能打印.

    目前中文文本文件常用的打印方法通常是,使用gb2ps/bg2ps/cnprint 等
    軟件轉(zhuǎn)換成PS文件打印, 轉(zhuǎn)換過程使用了中文的點陣字體. 對已經(jīng)形成的PS
    文件的打印, 如果不包含中文字體, 直接打印就會輸出亂碼, 通常使用的方法
    是將這一類PS文件過濾一下, 改為使用中文字體, 然后再打印. 如陳向陽先生
    的過濾軟件ps2cps可以打印Netscape的存儲文件. 這種打印的缺點是有時輸出
    的PS中漢字字符串和英文字符串對不齊. 最好的方法是在PostScript一級實現(xiàn)
    中文打印, 陳向陽先生對ghostscript進行了中文化, 可以直接使用TTF輕松打
    印Netscape, Qt/KDE, lyx等軟件輸出的PS文件. 這種從底層實現(xiàn)打印的方法
    也是日文和韓文所采用的方法.

    使用CID(adobe)字體打印的方法也在嘗試之中.

    總之, 目前的中文打印缺乏統(tǒng)一標準, 應(yīng)用軟件在輸出打印PS文件時多數(shù)
    不考慮雙字節(jié)語言的問題, 使打印變得更加復(fù)雜化, 所以當前的中文Linux發(fā)
    布版本多數(shù)不支持中文打印,


  • 客戶程序間通訊的國際化

    客戶程序間通訊(Interclient Communications Conventions, 簡稱ICCC)是
    客戶程序之間共享資源的手段之一. 最常見的應(yīng)用是文本的拷貝和粘貼和與窗口
    管理器通訊. 但是如果兩個應(yīng)用程序之間所使用的字符集不同, 粘貼就會出現(xiàn)問
    題, 甚至粘貼的內(nèi)容會丟失. 所以客戶程序之間必須國際化了的通訊協(xié)議.

    應(yīng)用程序和窗口管理器之間的通訊也屬于客戶程序間通訊.

    如果客戶程序之間使用的字符集相同, 但是編碼不同, 則不會丟失數(shù)據(jù),
    這時應(yīng)該使用復(fù)合文本(COMPOUND TEXT)傳輸. X內(nèi)部定義了COMPOUND_TEXT
    的原子(Atom)用于傳輸中英文混和的字符串. 對7字節(jié)編碼, ASCII或者其它
    ISO8859-1字符集, 客戶程序通訊可以不用轉(zhuǎn)換而直接使用XA_STRING原子傳輸.

    四 開發(fā)符合國際化標準的軟件
    在X窗口系統(tǒng)下開發(fā)軟件, 應(yīng)盡量符合國際化標準. 它包括, 設(shè)置合適
    的locale(見前面講述的在X下使用locale), 注意選擇字符集和字體集,
    本地化文本的處理, 輸入方法等等. 這里推薦用戶盡量使用在國際化方面
    已經(jīng)比較完善的高層圖形庫, 如Qt, gtk+, Java等, 這樣可以避免考慮以
    上問題. 選擇Motif時需要考慮資源的國際化問題和FontList等.
  • 開發(fā)國際化軟件

    使用已經(jīng)支持國際化的高層圖形庫開發(fā)支持國際化的軟件基本上可以不用
    考慮國際化問題. 特別是輸入問題, 在標準的輸入?yún)^(qū)內(nèi)(單行輸入和多行輸入),
    都可以自動輸入漢字. 在字體處理上, 注意使用字體集. 許多軟件需要在資源
    文件中指定字體和字體集, 所以開發(fā)的軟件應(yīng)提供一個缺省支持字體集的資源
    文件.

    下面所介紹的開發(fā)國際化的軟件是基于libX11的開發(fā)方法. 除了前面所說的
    在軟件初始化時調(diào)用一些Locale的函數(shù)外, 在實際編程時, 還應(yīng)注意以下問題:

  • 字體載入: 在處理字符串時, 使用FontSet, 而不是Font:

    XCreateFontSet() - 建立字體集
    XFreeFontSet() - 釋放字體集內(nèi)存
    XFontsOfFontSet() - 返回XFontStruct和字體名
    XBaseFontNameListOfFontSet() - 返回字體集的名稱
    XLocaleOfFontSet() - 返回XFontSet的locale名
    XExtentsOfFontSet() - 獲得FontSet的最大Extents


  • 計算字符串的屏幕尺寸并畫字符串:


    Xmb/XwcDrawString() - 只畫字型(glyphs)的前景
    Xmb/XwcDrawImageString() - 畫前景和背景
    Xmb/XwcDrawText() - 復(fù)雜的間隔和字體集
    Xmb/XwcTextEscapement() - X 方向像素
    Xmb/XwcTextExtents() - 字符串輪廓


  • 客戶程序間通訊:

    Xmb/wcTextListToTextProperty() - 根據(jù)locale的文本轉(zhuǎn)換
    Xmb/wcTextPropertyToTextList() - 根據(jù)locale的文本轉(zhuǎn)換
    XFreeStringList()
    Xmb/wcFreeStringList() - 釋放StringList
    XSetWMProperties() - 設(shè)置窗口管理器屬性
    XSetWMName() - 設(shè)置窗口窗口名
    XSetWMIconName() - 設(shè)置窗口圖標名


  • 輸入:

    XOpenIM()/XCloseIM() - 打開/關(guān)閉輸入服務(wù)器
    XDisplayOfIM()/XLocaleOfIM()
    XSetIMValues()/XGetIMValues() - 設(shè)置/獲取輸入服務(wù)器屬性
    XCreateIC()/XDestroyIC() - 建立/釋放IC
    XIMOfIC()
    XSetICValues()/XGetICValues() - 設(shè)置/獲取IC的值
    XSetICFocus()/XUnsetICFocus() - 聚焦/取消聚焦
    XmbResetIC()/XwcResetIC() - 重設(shè)IC
    XFilterEvent() - 過濾事件
    Xmb/wcLookupString() - 查找字符串
    XRegister/UnregisterIMInstantiateCallback() - 注冊/取消回調(diào)


  • 使非國際化軟件國際化

    修改已經(jīng)存在的非國際化軟件, 應(yīng)根據(jù)具體情況采用不同的補丁. 需要
    注意的是修改后的軟件應(yīng)與原來的軟件兼容, 不會對軟件以前在西文和其它
    語言的支持造成影響. Locale應(yīng)該是軟件的語言切換中心點. 下面是筆者在
    修改軟件的過程中一些經(jīng)驗, 僅供參考.


    • 在軟件初始化時設(shè)置Locale.
    • 定義gettext的宏, 并且把它與信息文件綁定.
    • 對所有靜態(tài)信息使用gettext
    • 對文本繪制使用字體集代替字體
    • 繪制函數(shù)使用X下的多字節(jié)或?qū)捵址瘮?shù)
    • 初始化和XIM服務(wù)器的聯(lián)接
    • 在事件循環(huán)中用XFilterEvent()過濾事件到XIM服務(wù)器
    • 使用Xmb/wcLookupString()查找字符串

    五 目前中文化中存在的問題
    現(xiàn)有的國際化標準中存在許多問題, 問題的原因主要出自目前的
    國際化架構(gòu). 對于中文化來說, 這些問題顯得更加突出.
  • 編碼動態(tài)切換的問題

    對中文軟件來說, 同時支持多內(nèi)碼(GB和Big5)是比較完善的中文軟件,
    但是動態(tài)切換內(nèi)碼, 特別是切換軟件界面(如菜單項)的內(nèi)碼, 是受到信息
    (Message)國際化中 gettext 的限制的. 一般來說, 一旦軟件載入, 所有
    文本信息便被初始化, 而且在整個過程中不會再重新裝載信息. 退一步說,
    即使重新裝載了信息, 由于所裝載信息的長度發(fā)生了變化, 軟件界面調(diào)整
    布局也是十分困難的.

    所以現(xiàn)有軟件的動態(tài)編碼切換僅僅是在部分區(qū)域?qū)崿F(xiàn), 例如Netscape.
    遺憾的是, Netscape的編碼切換并不徹底, 它切換的僅僅是顯示部分, 輸入
    部分仍然有問題. 比如在zh_CN.GBK的環(huán)境下啟動Netscape, 當切換到有
    輸入條的繁體中文頁面時, 如果采用輸入軟件自動識別Input Context的
    編碼的方式, 仍然會認為Netscape是GB編碼, 輸入結(jié)果不正確. 如果輸入
    Big5編碼, 必須縮定輸出的編碼為Big5. Chinput在這方面做了一些嘗試,
    結(jié)論是可以輸入Big5編碼, 但是在輸入條中的顯示不正確.

    一般來說, 使用中文平臺來動態(tài)切換編碼更容易實現(xiàn). 在中文Linux
    的發(fā)布版本中, 有幾個是可以使用中文平臺來實現(xiàn)動態(tài)切換編碼的, 其原理
    十分簡單, 只要在應(yīng)用程序或X服務(wù)器把某個窗口的編碼狀態(tài)記住就行了,
    以后的文本顯示和輸入都以此編碼為標準. 這種方法的缺點是, 應(yīng)用程序
    初始界面上的中文由于轉(zhuǎn)化了編碼變成了亂碼.



  • 中文編碼自動識別問題

    在文本瀏覽,網(wǎng)頁瀏覽或網(wǎng)頁翻譯時, 通常需要自動識別漢字的內(nèi)碼,
    但是中文的GB編碼和Big5編碼有重疊區(qū)域, 所以很難區(qū)分開. 目前公開
    源代碼的識別軟件很少, 識別結(jié)果不能令人滿意, 遠沒有達到目前商業(yè)軟件
    的識別水平.


  • Linux上的中文平臺到國際化的過渡


    但是從長遠的角度看, 因為中文在對中文顯示和輸入上與國際化標準
    存在很大差異, 所以亟需一種從中文平臺到國際化標準的過渡性方案. 在
    過渡的過程中, 中文平臺可能會和國際化標準共同存在一段時間.

    以CLE和TurboLinux為例, 它們在早期的版本中都采用了中文平臺來
    支持中文的顯示和輸入, 隨著支持國際化標準的軟件的增多, 逐步采用了
    中文平臺和國際化標準共同存在的版本作為過渡性版本. 到目前為止, 已經(jīng)
    在缺省情況下放棄中文平臺的使用. 中文平臺只是作為殘留物包含在發(fā)布
    版本中.



  • Linux 文檔中文化

    Linux文檔, 主要是指Linux上的一些命令幫助文檔(man文件), 軟件
    手冊和說明, 軟件本身的Message文件(po). 目前在這方面的工作還缺乏
    統(tǒng)一的管理和廣大Linux愛好者的參與.

    參考資料
    • Unicode: http://www.unicode.org/
    • 香港增補字符集: http://www.digital21.gov.hk/chi/hkscs/introduction.html
    • CJK 有關(guān)信息: ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf
    • Linux國際化資料: http://i18n.linux.org.tw/
    • Linux國際化標準: http://www.li18nux.org/.
    • MicroSoft 國際化: http://www.microsoft.com/globaldev/
  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 永仁县| 简阳市| 玉屏| 托克托县| 沅陵县| 河池市| 武安市| 永登县| 瑞丽市| 商都县| 灵宝市| 金塔县| 乌兰察布市| 孟村| 北川| 天峻县| 铜鼓县| 洪泽县| 南汇区| 蒙山县| 开封市| 保亭| 高唐县| 平塘县| 保定市| 泗水县| 黔南| 米脂县| 杂多县| 江孜县| 大竹县| 康马县| 佛冈县| 永城市| 隆化县| 南雄市| 平定县| 迁西县| 东方市| 沧州市| 沧州市|