GB18030 根上跟 Unicode 有關係嗎?

如題,還有為什麼國家不去支持Unicode來增強中華民族語言文字在計算機支持而是自造輪子GB18030呢?


當然有。

GB 18030:2005 本身就是一種 UTF,只不過為了兼容 GBK 映射很反常罷了

標準原文第七節裡面寫的非常明確。(GB 13000 是 ISO/IEC 10646-1 的等效標準)

後面的碼錶也是,每個字底下都跟著 unicode


在回答這個問題前,首先要清楚「Unicode」是什麼(What is Unicode?)。其次,要理解信息技術相關的國標中,幾份編碼字符集相關的標準,各自之間的引用、沿用關係,以及它們的源頭。

- - -

GB 18030—2005《信息技術——中文編碼字符集》,它的標題已經很明確地指出了這份標準的核心內容:編碼字符集(coded character set)。

當然,延續了以往所有編碼字符集相關的國標,它也伴隨字符集給出了一種編碼方案——這是一種單、雙、四位元組混合的編碼方案(按照國標的術語,也就是為字元指派了「內碼」)。

在 2005 年,GB 18030—2005 的字符集,實質上使用了 GB 13000 的字符集的一個子集(也可以說是在 GB 13000.1—1993 的基礎上,擴增收入了一些新的字元);GB 13000.1—1993 是 1993 年 ISO/IEC 10646-1:1993 的等效標準;另外,2010 年修訂(補完)的 GB 13000—2010 則是 ISO/IEC 10646:2003 的等效標準。而 ISO/IEC 10646 跟 Unicode 有一層很緊密的聯繫,但它們絕非等同,詳情可參考 Unicode 官方的 FAQ(FAQ - Unicode and ISO 10646)。

GB 18030 跟 Unicode 的關係紐帶,實質上就存在於 ISO/IEC 10646 這份標準中。

- - -

問題說明裡的追問,缺乏前提。GB 18030 本身就不是什麼「自造的輪子」。

GB 18030—2005 文檔中明確引用的國標有 5 份。其中 GB/T 2311—2000、GB/T 11393—1989 和 GB 13000.1—1993 都是對應 ISO/IEC 的等效標準;也就是說,國標明確聲明了這些標準用了現成的輪子。並且,GB 13000 字符集的後續擴增及修訂,依然在同步其等效對象 ISO/IEC 10646。

另外,GB 18030—2005 的重要兼容對象——GB 2312—80——這份標準也不是純粹自造的,它很大程度上受到了日本工業標準 JIS C 6226-1978 的啟發(也就是後來的 JIS X 0208)。雖然官方發布首版 JIS C 6226 是在 1978 年,但早在 1960 年代末、1970 年代初,相關標準就已經開始制定並發展了,這份標準可算是後續日、中、台、韓多位元組編碼字符集標準的源頭。

至於國標本身的意義,在我看來最大的作用就是「強制力」的合法化。

- - -

最後,你還可以向自己提這樣的問題:既然 ISO/IEC 10646 跟 Unicode 的關係如此緊密,那麼它存在的意義又是什麼?


不懂呢,不要亂噴,噴人也要講基本法的

Unicode是什麼,通俗地說是一套字元編號的標準,它規定了哪些叫字元,這個字元寫出來是什麼樣子,然後賦予每個字元一個唯一編號。這個編號一定是正整數或者0。

此外還規定了某些編號表示控制字元,而不是代表實際可以書寫的字元,比如 tab 換行 分段 左右閱讀順序轉換標記等。

光有這些編號還是不夠的,還要約定這個編號在計算機里怎麼存儲,於是有了 UCS-2 UCS-4 UTF-8 UTF-16等標準,這個叫Unicode的編碼標準。

Unicode誕生其實是比較晚的,那麼在Unicode誕生之前字元怎麼編號呢?

計算機發明之初只有英文,美國人發明的嘛,所以 0-127 個字元就足夠,後來擴展到0-255,這就是ASCII,由於歐美語言的特性就是拼音文字,字母很少,256個字元足夠包括所有主流歐美語言的字母了,還包括了大量數字元號。

但是當計算機開始處理非歐美語言的時候 256個顯然不夠了,典型就是東亞語言,所有一個叫CJK的問題,就是中日韓的意思。

當時的主流解決方案是把字元編碼擴展到2個位元組,其中第一個位元組高位為 1 表示 lead byte,配合後面一個位元組來表示一個字元。

各個國家分別制定了各國的標準,這個標準每個國家都不一樣,沒有統一國際標準。

這些標準就是 中國 GB2312,日本的 shift-JIS 台灣(地區)的BIG5 韓國是 KS,它們規定了各個國家的字元都有哪些,編號多少,在計算機內存里怎麼存儲。

每個編碼標準分配了一個編號叫 code page,GB標準就是 codepage 936

後來Unicode標準制定的時候,也遵照了這些標準,收錄了它們的字符集,因為這些字元已經事實上在使用了,Unicode必須涵蓋。

不是中國在造輪子,而是Unicode這個輪子出來太晚了,各個國家都在造輪子。

那麼已經有了Unicode的情況下為什麼還要有GB18030呢,因為GB2312編碼標準里的漢字太少了,GB2312里只有 6763個漢字,顯然不夠用,需要一個字符集更多的標準。

中國民族文化複雜,有大量少數民族語言的字元要收錄,所以需要一個自己的標準,這些字元進Unicode標準太難了,早期Unicode空間只有65536,顯然嚴重不夠用。

另外還要兼容過去的 GB2312,畢竟這麼多年來大量的數據文獻都是GB編碼的,還要兼容著,日本也沒放棄shiftJIS,台灣還在用BIG5。

GB標準的制定是要參照Unicode的,unicode里的漢字都有對應的GB編碼,所以說GB18030是支持Unicode的。

其實ASCII也是一種codepage,而且美國還不止一種,比如常見的 Code page 437 是IBM PC的標準,Code page 1252 是Windows的標準,日本韓國也不止一種標準 日本有 JIS shift-JIS,韓國有 KS和UHC,中國也是大陸和台灣兩套。

未來我相信編碼會逐漸統一到 Unicode,但是各個國家的標準由於歷史原因會長期存在。


可以說Unicode中的中文標準是參照GB18030來做的,沒有它也不會有今天的Unicode中的中文部分(至少差異會更大)

但是GB18030不僅僅是字符集,也是編碼表示方式;Unicode只是字符集,它有多種表示方式。


請參考拙作——編碼歪傳——基礎篇

TL;DR

字符集:收錄了若干字元,並且對它們編號索引。

字元編碼:將一種字符集當中的編號索引,使用計算機能處理的技術要求和格式(通常是以位元組為最小單位)做二進位實現。

----分割線----

GB2312是字符集,也是字元編碼,收錄量大約幾千個字元。

GB18030是字符集,也是字元編碼,是對GB2312的一個巨大擴展,收錄量大約7萬多字元。

以上兩個是國標

GBK是微軟對GB2312的擴展,兼容GB2312(而GB18030不完美兼容GBK),GBK不是國標。

----分割線----

Unicode是「萬國碼」字符集,同時它也是一種很樸素的編碼,但少有程序會直接用這種編碼。

更多程序會使用Unicode Transform Format/UTF編碼,比較常見的是UTF-8UTF-16

----分割線----

為什麼不支持Unicode而造GB18030?

1、Unicode是全世界用的,受到ISO等制約,並且非常向英語妥協。它不見得是對中文字元最完美的編碼方案。打個比方,UTF-8編碼方式大多數中文字元需要3位元組,而GB18030編碼方式大多數中文字元只需要2位元組。

2、GB18030是完美兼容GB2312的,這對於中文環境下的遺留系統兼容是非常好的特性。根據維基百科顯示,Unicode在1992年才收錄中文字元,1993年的Unicode 1.1版本中文收錄量是和GB18030差不多的,而GB2312早在80年代就開始普及。並不是我們不兼容Unicode,而是Unicode不兼容我們。對於GB18030而言,他承擔了擴展GB2312的作用,不是簡單的造輪子搞標準分化能解釋的。Windows在1995年推出了GBK,它是完美兼容GB2312的。在那個年代,互聯網還不像今天這麼發達,根據不同語言環境選擇性價比高的編碼方案,還是可以理解的。


Unicode里的中文字符集是基於GB18030的,當然沒有採用GB的編碼方式,Unicode CJK工作組裡還有日本和韓國的成員。

GB18030作為一個標準來說是GB2312和GBK的升級,其編碼方式向下兼容之前的標準。

過渡到Unicode/ISO10646其實一直都在做,但是之前支持GB2312的東西不可能一夜之間全都扔掉。

有人說官老爺的飯碗問題,這就有點搞笑了,Unicode裡面的中文部分不就是這些官老爺們制定么?而且還有對應Unicode的國家標準GB13000,就算全用Unicode他們也不可能失業不是?


推薦一下字談字串(二)

https://castro.fm/episode/5rLXNd

裡面涉及很多中文字符集和 Unicode 的歷史。

下面是這期 podcast 的 show note

亂碼,漢字圈電腦用戶難免遭遇的問題。今日又串《內核恐慌》,亂談亂碼。

本期 123 分鐘,我們著眼漢字,回望字符集發展簡史,一覽常見遺留編碼,笑看端序內戰風雲,攜手擁抱 Unicode。

參考鏈接

  • 「紐倫堡內麥塔狐」,典出《字談字暢》第二十三期
  • 曲(qū/qǔ),麯 / 麴 (qū)
  • 區位碼的「區位」即「row-cell」,日語稱「區點」
  • Ten key
  • 算術基本定理
  • 各國讀寫電話號碼的習慣;另有 ITU-T 起草的推薦規範 E.123,包含國際電話號碼的註記格式
  • 電話編號規劃
  • TeX 指令通常以反斜杠()開頭
  • 各書寫系統中的引號
  • 「亂碼」在幾種外語里的表述:
    • 文字化け(日語)
    • Mojibake(英語,音譯自日語)
    • Zeichensalat(德語,直譯即「符號沙拉」)
  • Emoji(音譯自日語「絵文字」)
  • ASCII(美國信息交換標準代碼)
  • JIS X 0201,七位及八位信息交換用編碼字符集;前身為制定於 1969 年的 JIS C 6220,是日本最早的編碼字符集規範
  • JIS X 0208,七位及八位雙位元組信息交換用漢字編碼字符集
  • ??(諺文) / ??(韓字) / ???(朝鮮字),英語通稱 Hangul
  • 半形片假名
  • 編碼,《內核恐慌》第十八期
  • GB 2312,信息交換用漢字編碼字符集·基本集
  • GBK,漢字內碼擴展規範;Windows 系統的代碼頁 CP936 是它的一個實現
  • GB 18030,信息技術——中文編碼字符集
  • GB 12345,信息交換用漢字編碼字符集·輔助集
  • 單射
  • 「干 / 乾」這對字具有「一繁對多簡」和「一簡對多繁」的雙重屬性
  • 新加坡漢字 / 新馬簡體
  • Big5(大五碼),港澳台較常用的編碼及字符集標準
  • Code page(代碼頁)
  • Unicode
  • Unicode BMP(Basic Multilingual Plane,基本多語言平面),GB 13000.1 與 Unicode BMP 的相關標準基本等同
  • Unicode 定義的 script
  • 中日韓統一表意符號(CJK Unified Ideographs)
  • 芸(U+82B8),同時為中文「蕓」、日文「藝」的簡化字
  • KS X 1001,韓國編碼字符集標準,前身為 KS C 5601;對同形異音的漢字進行重複編碼
  • 日本的「中國地方」
  • 「支那」源自梵文 ??? (cīna)
  • Ken Lunde. CJKV Information Processing, 2nd Edition. O"Reilly Media, 2008
  • 當下 Unicode 最常用的三種編碼格式:
    • UTF-8
    • UTF-16
    • UTF-32
  • Rio 撰於 2012 年的 Unicode 編碼相關知識的筆記
  • Surrogate pair,用於 UTF-16,藉以擴展編碼範圍
  • Endianness(端序),該術語典出《格列佛遊記》小人國內的兩個教派
  • BOM(byte order mark,位元組順序標記),對應的字元是 U+FEFF (Zero Width No-break Space)
  • (U+1F574, Man in Business Suit Levitating)


GB 18030是完全向下兼容GB 2312的,裡面除了GB 2312、GB 12345和GBK以外還收錄了我國彝藏蒙朝維等少數民族文字及其他幾種字符集一直沒有收錄的字元,比如台灣地區使用的豎排標點等。

那麼GB 2312有多久的歷史呢?目測比題主的年齡都大。GB 2312制定的時候Unicode連個受精卵都他媽還不是。標準的制定,從來都是尊敬長者、後來的兼容老的,沒有反過來的。

GB 18030的編碼結構保持了GB 2312那種與ASCII可清晰區分不易混淆的特點,編碼本身的值和它儲存時的值完全一致。但是Unicode就不可能做到,比如x21x6B到底是一個字元「Ⅻ」,還是兩個字元「!k」?如果再考慮到大小端序,是不是還有可能是漢字「次」呢?人們吶就都不知道,機器更不可能判斷。所以直接儲存編碼值的大小是不行的,必須轉化成UTF-8、UTF-16等格式中的一種,才能被正確地識別,不出現歧義。我們平常為了表示「Ⅻ」這個字元,會寫成「U+216B」,因為人習慣於直接看編碼值本身的大小,這樣比較直觀,如果寫成UTF-8或UTF-16,就有可能需要轉換,造成不便。正如人們習慣用十進位而很少用二進位去寫一個數字一樣。

Unicode沒有規定「徑」的右邊到底是「スエ」還是「聖」,也沒有規定「辶」到底是一點還是兩點。然而陸台日韓對於同一漢字的寫法往往是不同的,如果只聽Unicode的,那麼一個漢字就會有好幾種寫法,那麼到底聽誰的?誰才是規範的寫法?這時候就需要各自的國家或地區標準來表態了。


GB 18030與GB 2312-1980完全兼容,與GBK基本兼容,支持GB 13000及Unicode的全部統一漢字,共收錄漢字70244個。

另外,你這樣幹了,你讓國家標準化管理委員會這些老爺怎麼活??談何國產化?談何中國製造!?中國夢怎麼實現?!


GB 2312 是參考 JIS 的字符集。

GBK 是在 GB 2312-EUC 的基礎上按當時的 Unicode CJK 擴充的。

GB 18030 是對 GB 2312-EUC 的擴充,參考 GBK,是一種 UTF。

既然是一種 UTF 的話,那麼它顯然就和 Unicode 有關係了。

論 GB 18030


Unicode是哪年的事情,Windows支持unicode得要2000,至於98是01年之後才支持的。

所以GB18030在2000年初版,GB2312是1980標準。可以說他們是同時發展起來的。


有GB13000啊...


題主這個問題,本質上非常好笑。如果中國國家標準不把gb2312、gbk兼容擴展為GB18030的兩個版本,全社會的應用會什麼局面?看看彎彎的大五碼就知道了。真是笑死人。

大五碼共收錄13,060個漢字 。這點容量,在信息社會夠用嗎?台灣與香港為什麼不強制淘汰大五碼完全改用Unicode?

於是,請參看中文維基的https://zh.wikipedia.org/wiki/大五碼#Big5延伸

由於Big5碼內的一萬多個字,只是根據彎彎教育部頒布的《常用國字標準字體表》、《次常用國字標準字體表》等用字彙編而成,並沒有考慮社會上流通的人名、地名用字、方言用字、化學及生物科學等用字,亦沒有放入日語平假名及片假名字母。所以在市面上支援Big5碼的軟體,有不少都自行在原本的編碼外,添加一些符號及用字。結果就是「萬碼奔騰」:

倚天中文系統為與IBM5550碼相容,在Big5碼添加了以下字元,稱為倚天擴充字集

Windows使用的Code Page 950,只添加了0xF9D6-0xF9FE的倚天擴充字及表格符號,並沒有加入日文假名字母等其他延伸。

「中國海字集」是中國海公司所出品的繁體漢字造字檔。包括了不少社會上常見的用字、日文假名、和字等,加上曾與Office 97中文版一併發售,所以比起其他官方Big5延伸,更被台灣民眾所接受。香港部份BBS網路在香港增補字符集未出現之前,一度以中國海字集為標準。

「日和字集」乃香港開發的造字檔,以兼容香港增補字符集為賣點,為字集中仍沒函蓋的日本漢字和日本國字作增補,並附有倉頡、速成等輸入法作輔助。

「Unicode補完計畫」前稱「BIG5 Extension」,透過修改Microsoft Windows及Mozilla的編碼表,從而使用者能在網上傳遞及交換文字。有鑒於「中國海字集」的成功,「Unicode補完計畫」第二版採用了「中國海字集」原有的造字,再加上「中國海字集」所欠的部分簡體中文字及香港粵語用字,建成一個能在Big5及Unicode之間轉換的編碼表;該計劃目前已推出了64位元測試版。

中華民國教育部造字檔 中華民國教育部有它本身的一套造字檔,主要給部門內使用,亦於教育部的網路字典使用。

中華民國行政院農委會常用中文外字集 中華民國行政院農業委員會曾制訂一套有133個漢字的造字檔,其中有84個是魚字部漢字、7個是鳥字部漢字。

Big5+ 1997年中華民國行政院研究發展考核委員會成立專案委託中文數位化技術推廣基金會(中推會)辦理Big5+擴編計畫,使用了兩萬多碼位,納入了Unicode 1.1下所有漢字。由於編碼使用到的範圍超過原先Big5定義(Big5+使用了高位元組0x81-0xFE,低位元組0x40-0x7E、0x80-0xFE),無法安裝在Microsoft Windows上,現幾乎無人使用。

Big-5E 為了使Microsoft Windows使用者可以使用造字檔,中華民國行政院研考會再度委託中推會推出一個補充字集Big-5E(與Big5+並不兼容),共收3954字。因為Big5+的編碼限制,再加上Unicode已漸成氣候,除了部分政府單位使用之外,Big-5E並沒有被廣泛的接受。Mac OS X 10.4及以上支援Big-5E。

Big5-2003 鑒於Big5不是官方標準,中推會接受經濟部標準檢驗局委託,召集台灣國內業者、專家和學者編製一個Big5的對照表,並把它放到台灣官方的CNS 11643附錄里,正式成為官方標準的一部分。在Big5-2003之中,收錄了所有在1984年Big5編碼的所有字元,另外再加入微軟CP950的歐元符號、倚天延伸字集的0xA3C0-0xA3E0、0xC6A1-0xC7F2、0xF9D6-0xF9FE的用字。Big5-2003沒有收錄行列輸入法特殊符號及0xC7F3-0xC875的俄語西里爾字母,理由是以CNS 11643沒有這些字元。除此之外,所有倚天延伸全部收錄。相對於Big5-2003,最早沒有加上延伸之Big5則對稱為Big5-1984。

香港增補字符集(Hong Kong Supplementary Character Set,簡稱HKSCS)是香港政府基於大五碼之上擴展的字符集標準,是現時香港的中文資訊交換內碼標準。香港增補字符集以前稱為《政府通用字型檔》,本來只是香港政府內部統一使用的造字檔,有三千多字。但由於香港電腦業界不斷要求政府迎合本地需要,提出官方的字符集方案,以便與政府進行文件來往,於是香港政府便在1995年把這個內部使用的標準公開。到了1999年,此字集增加到四千多字,並改為現名。此字符集由中文界面諮詢委員會管理,仍在不斷擴編之中。字符集主要包括香港地名、人名用漢字、粵語用字(包括粗言穢語在內,這是應警方及法庭需要記錄口供的需要)、異體字、小部份簡體字、平假名、片假名及俄語西里爾字母。


推薦閱讀:

傳統蒙古文(回鶻式蒙古字母)的 Unicode 方案有哪些方面給日常應用帶來了麻煩?
為什麼有的生僻字有unicode碼位卻仍然打不出來?
有沒有人把Unicode 按Code Chart里的字體完整地做成一個字體?
理論上一個位元組能不能表示一個漢字?
Python2.7 中文字元編碼,使用Unicode時,選擇什麼編碼格式?

TAG:Unicode統一碼 | 字元編碼 |