问题

GB 18030 根上跟 Unicode 有关系吗?

回答
GB 18030 和 Unicode 之间存在非常密切且复杂的关系,理解这种关系对于处理中文和东亚字符集至关重要。简单来说,GB 18030 是中国国家标准,它 包含并扩展了 Unicode 中的部分字符,并且在设计上 与 Unicode 保持了兼容性。

下面我将尽量详细地解释它们之间的关系:

1. GB 18030 是什么?

定义: GB 18030 是中华人民共和国的国家标准《信息交换用汉字编码字符集 GB 18030》。它是目前中国大陆用于汉字输入、显示和处理的 强制性国家标准。
目的: GB 18030 的主要目的是为了解决中国大陆在信息处理中字符编码的混乱问题,提供一个统一、全面、支持中文及其他少数民族语言的编码方案。它需要支持大量的汉字,以及一些非汉字字符。

2. Unicode 是什么?

定义: Unicode 是一项国际标准,旨在为世界上所有的字符(包括字母、数字、符号、象形文字等)分配一个唯一的数字标识符,称为 码点 (Codepoint)。
目标: Unicode 的目标是创建一个全球统一的字符集,消除了不同编码方案之间由于字符表示不同而导致的乱码问题。
编码形式: Unicode 本身只是一个字符集,定义了码点。实际在计算机中存储和传输时,需要将其转换为字节序列,这通过不同的编码形式实现,最常见的是 UTF8, UTF16, UTF32。

3. GB 18030 与 Unicode 的关系是如何建立的?

GB 18030 在设计时就充分考虑了与 Unicode 的兼容性,并且 以 Unicode 为基础并进行扩展。我们可以从以下几个方面来理解:

兼容 Unicode: GB 18030 在其编码空间中 包含了大量的 Unicode 码点。这意味着,如果一个字符在 Unicode 中有唯一的码点,并且这个码点被包含在 GB 18030 的编码范围内,那么在 GB 18030 中,这个字符的表示也会与其 Unicode 码点相对应。
扩展 Unicode: GB 18030 的设计目标是支持比早期 Unicode 版本(如 Unicode 2.0 或 3.0)更多的汉字,特别是大量的生僻字、繁体字、以及一些中国特有的字符(如一些古代文字、农历日期相关的符号等)。因此,GB 18030 扩展了 Unicode 中尚未包含或尚未完全标准化的字符集。这意味着 GB 18030 可能包含一些 Unicode 中还没有被收录的字符,或者以一种更完善的方式收录了某些字符。
编码形式与码点映射: GB 18030 采用一种 变长字节编码 的方式来表示字符。这种编码方式与 UTF8 有很多相似之处,但也有区别。
单字节: 前128个码点(0x00 0x7F)与 ASCII 兼容,代表英文字母、数字和基本符号。
双字节: 覆盖了 ASCII 的范围之外的许多常用汉字和符号。
三字节: 覆盖了更多的汉字和非汉字字符。
四字节: 这是 GB 18030 的一个重要扩展,用于表示 Unicode 的辅助平面(Supplementary Planes)中的字符,这些字符的码点超过了 U+FFFF。许多罕见的汉字、表情符号、历史字符等都位于辅助平面。

关键点在于:GB 18030 的编码方案是根据 Unicode 的码点来设计的。 当一个字符在 Unicode 中被分配了一个码点时,GB 18030 会尝试为它找到一个对应的编码表示。如果这个 Unicode 码点在 GB 18030 的编码范围内,那么它们之间就存在一种映射关系。

映射关系(Mapping): GB 18030 实际上定义了一个到 Unicode 码点的映射。当计算机读取一个 GB 18030 编码的字节序列时,它会将其解码为一个 Unicode 码点。反之,当需要将一个 Unicode 码点编码为 GB 18030 时,如果该码点在 GB 18030 的支持范围内,也会被转换为相应的 GB 18030 字节序列。

4. GB 18030 与 UTF8 的区别与联系:

GB 18030 和 UTF8 都是用于在计算机中表示字符的编码方案,它们都以 Unicode 为基础。

共同点:
都基于 Unicode 码点。
都使用变长字节编码。
都旨在支持广范围的字符。

区别:
编码范围和字节长度: 虽然都支持 Unicode,但 GB 18030 的设计初衷和具体实现细节有所不同。GB 18030 设计时对大量中日韩(CJK)汉字做了更细致的考虑。在某些 Unicode 码点(特别是辅助平面中的)的表示上,GB 18030 使用四字节编码,这与 UTF8 的四字节编码方式不完全相同。
兼容性保证: GB 18030 明确地保证了对 Unicode 的兼容性,并且通过其四字节编码,能够表示 Unicode 的辅助平面。UTF8 本身就是一种标准的 Unicode 编码形式,其设计目标就是无损地表示所有 Unicode 字符。
使用场景: GB 18030 主要在中国大陆地区作为强制性标准使用,尤其是在政府、出版、教育等领域。UTF8 则在全球范围内更为通用,是互联网上最流行的编码。

5. 实际应用中的影响:

数据交换: 在中国大陆,任何需要处理中文信息(特别是政府、出版等领域的官方数据)的系统都必须支持 GB 18030。当与其他国家或系统交换数据时,如果对方系统只支持 ASCII 或其他非 Unicode 编码,就需要进行 GB 18030 到目标编码的转换。
乱码问题: 如果一个系统未能正确识别或处理 GB 18030 编码的文本(例如,一个只支持 GBK 的系统尝试显示 GB 18030 中特有的四字节字符),就可能出现乱码。
开发人员的考量: 在开发软件时,尤其是在处理中国大陆用户的文本输入和显示时,必须考虑 GB 18030 的支持。通常,现代操作系统和编程语言都会提供对 GB 18030 的支持,但需要正确地指定和使用。

总结:

GB 18030 根上跟 Unicode 有关系,而且是非常紧密的关系。GB 18030 可以被看作是 Unicode 的一个“中国本土化”的实现和扩展版本。它以 Unicode 码点为基础,通过变长字节编码来表示字符,并且扩展了对大量汉字及其他字符的支持,尤其是能够表示 Unicode 的辅助平面中的字符(使用四字节编码)。因此,GB 18030 的设计是建立在 Unicode 的基础之上的,并且与 Unicode 保持着高度的兼容性。理解这种关系有助于我们更好地处理跨语言、跨字符集的文本数据。

网友意见

user avatar

在回答这个问题前,首先要清楚「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 的关系如此紧密,那么它存在的意义又是什么?

user avatar

不懂呢,不要乱喷,喷人也要讲基本法的

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,但是各个国家的标准由于历史原因会长期存在。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有