[ZT] 首先讲讲所有编码类型 Uni code 是一种字符编码规范 。先从ASCI I 说起。 ASCI I 是用来表示英文字符的一种编码规范, 每个ASCI I 字符占用 1 个字节(8bi ts) 因此, ASCI I 编码可以表示的最大字符数是256, 其实英文字符并没有那么多,一般只用前1 28 个(最高位为 0) , 其中包括了控制字符、 数字、 大小写字母和其他一些符号 。而最高位为 1 的另 1 28 个字符被成为“扩展ASCI I ”, 一般用来存放英文的制表符、 部分音标字符等等的一些其他符号 这种字符编码规范显然用来处理英文没有什么问题 。 (实际上也可以用来处理法文、 德文等一些其他的西欧字符, 但是不能和英文通用) , 但是面对中文、 阿拉伯文之类复杂的文字, 255 个字符显然不够用 于是, 各个国家纷纷制定了自己的文字编码规范, 其中中文的文字编码规范叫做“GB231 2-80”, 它是和 ASCI I 兼容的一种编码规范, 其实就是利用扩展 ASCI I 没有真正标准化这一点, 把一个中文字符用两个扩展ASCI I 字符来表示。 但是这个方法有问题, 最大的问题就是, 中文文字没有真正属于自己的编码,因为扩展ASCI I 码虽然没有真正的标准化, 但是PC 里的 ASCI I 码还是有一个事实标准的(存放着英文制表符) , 所以很多软件利用这些符号来画表格。 这样的软件用到中文系统中, 这些表格符就会被误认作中文字, 破坏版面。 而且, 统计中英文混合字符串中的字数, 也是比较复杂的, 我们必须判断一个ASCI I 码是否扩展, 以及它的下一个ASCI I 是否扩展, 然后才“猜” 那可能是一个中文字 。总之当时处理中文是很痛苦的。 而更痛苦的是GB231 2 是国家标准, 台湾当时有一个Bi g5 编码标准, 很多编码和 GB 是相同的, 所以……, 嘿嘿。 这时候, 我们就知道, 要真正解决中文问题, 不能从扩展ASCI I 的角度入手,也不能仅靠中国一家来解决。 而必须有一个全新的编码系统, 这个系统要可以将中文、 英文、 法文、 德文……等等所有的文字统一起来考虑, 为每个文字都分配一个单独的编码, 这样才不会有上面那种现象出现。 于是, Uni code 诞生了。 Uni code 有两套标准, 一套叫 UCS-2(Uni code-1 6), 用 2 个字节为字符编码,另一套叫 UCS-4(Uni code-32), 用 4 个字节为字符编码。 以目前常用的 UCS-2 为例, 它可以表示的字符数为 2^1 6=65535, 基本上可以容纳所有的欧美字符和绝大部分的亚洲字符 。 UTF-8 的问题后面会提到 。在Uni code 里, 所有的字符被一视同仁。 汉字不再使用“两个扩展ASCI I ”, 而是使用“1 个Uni code”, 注意, 现在的汉字是“一个字符” 了, 于是, 拆字、 统计字数这些问题也就自然而然的解决了 。但是, 这个世界不是理想的, 不可能在一夜之间所有的系统都使用 Uni code 来处理字符, 所以 Uni code 在诞生之日, 就必须考虑一个严峻的问题: 和 ASCI I 字符集之间的不兼容问题。 我们知道, ASCI I 字符是单个字节的, 比如“A”的 ASCI I 是65。 而Uni code 是双字节的, 比如“A”的 Uni code 是0065, 这就造成了一个非常大的问题: 以前处理ASCI I 的那套机制不能被用来处理Uni code 了 。另一个更加严重的问题是, C 语言使用' \0' 作为字符串结尾, 而Uni code 里恰恰有很多字符都有一个字节为 0, 这样一来, C 语言的字符串函数将无法正常处理Uni code, 除非把世界上所有用 C 写的程序以及他们所用的函数库全部换掉 。于是, 比 Uni code 更伟大的东东诞生了, 之所以说它更伟大是因为它让 Uni code 不再存在于纸上, 而是真实的存在于我们大家的电脑中。 那就是: UTF 。 UTF= UCS Transformati on Format UCS 转换格式 它是将Uni code 编码规则和计算机的实际编码对应起来的一个规则。 现在流行的 UTF 有2 种: UTF-8 和 UTF-1 6 。其中 UTF-1 6 和上面提到的 Uni code 本身的编码规范是一致的, 这里不多说了。而UTF-8 不同, 它定义了一种“区间规则” , 这种规则可以和 ASCI I 编码保持最大程度的兼容 。 UTF-8 有点类似于Haffman 编码, 它将Uni code 编码为 00000000-0000007F 的字符, 用单个字节来表示; 00000080-000007FF 的字符用两个字节表示 00000800-0000FFFF 的字符用 3 字节表示 因为目前为止Uni code-1 6 规范没有指定FFFF 以上的字符, 所以 UTF-8 最多是使用 3 个字节来表示一个字符。 但理论上来说, UTF-8 最多需要用 6 字节表示一个字符。 在UTF-8 里, 英文字符仍然跟ASCI I 编码一样, 因此原先的函数库可以继续使用。 而中文的编码范围是在0080-07FF 之间, 因此是2 个字节表示(但这两个字节和 GB 编码的两个字节是不同的) , 用专门的 Uni code 处理类可以对UTF 编码进行处理。 下面说说中文的问题。 由于历史的原因, 在Uni code 之前, 一共存在过3 套中文编码标准。 GB231 2-80, 是中国大陆使用的国家标准, 其中一共编码了 6763 个常用简体汉字。 Bi g5, 是台湾使用的编码标准, 编码了台湾使用的繁体汉字, 大概有8 千多个。 HKSCS, 是中国香港使用的编码标准, 字体也是繁体, 但跟Bi g5 有所不同。 这3 套编码标准都采用了两个扩展ASCI I 的方法, 因此, 几套编码互不兼容,而且编码区间也各有不同 因为其不兼容性, 在同一个系统中同时显示GB 和 Bi g5 基本上是不可能的。 当时的南极星、 Ri chWi n 等等软件, 在自动识别中文编码、 自动显示正确编码方面都做了很多努力 。他们用了怎样的技术我就不得而知了, 我知道好像南极星曾经以同屏显示繁简中文为卖点。 后来, 由于各方面的原因, 国际上又制定了针对中文的统一字符集GBK 和 GB1 8030, 其中 GBK 已经在Wi ndows、 Li nux 等多种操作系统中被实现。 GBK 兼容GB231 2, 并增加了大量不常用汉字, 还加入了几乎所有的 Bi g5 中的繁体汉字。 但是GBK 中的繁体汉字和 Bi g5 中的几乎不兼容。 GB1 8030 相当于是GBK 的超集, 比 GBK 包含的字符更多。 据我所知目前还没有操作系统直接支持GB1 8030。 谈谈Uni code 编码, 简要解释UCS、 UTF、 BMP、 BOM 等名词 这是一篇程序员写给程序员的趣味读物。 所谓趣味是指可以比较轻松地了解一些原来不清楚的概念, 增进知识, 类似于打RPG 游戏的升级。 整理这篇文章的动机是两个问题:问题一: 使用 Wi ndows 记事本的“另存为” , 可以在GBK、 Uni code、 Uni code bi g endi an 和 UTF-8 这几种 编码方式间相互转换。 同样是txt 文件, Wi ndows 是怎样识别 编码方式的呢?我很早前就发现Uni code、 Uni code bi g endi an 和 UTF-8 编码的 txt 文件的开头会多出几个字节, 分别是FF、 FE(Uni code) , FE、 FF(Uni code bi g endi an) , EF、 BB、 BF(UTF-8) 。 但这些标记是基于什么标准呢?问题二: 最近在网上看到一个ConvertUTF. c, 实现了 UTF-32、 UTF-1 6 和 UTF-8 这三种 编码方式的相互转换。 对于Uni code(UCS2)、 GBK、 UTF-8 这些 编码方式, 我原来就了解。 但这个程序让我有些糊涂, 想不起来UTF-1 6 和 UCS2 有什么关系。 查了查相关资料, 总算将这些问题弄清楚了, 顺带也了解了一些Uni code 的细节。 写成一篇文章, 送给有过类似疑问的朋友。 本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节, 什么是十六进制。 0、 bi g endi an 和 l i ttl e endi an bi g endi an 和 l i ttl e endi an 是CPU 处理多字节数的不同方式。 例如“汉” 字的 Uni code 编码是6C49。 那么写到文件里时, 究竟是将6C 写在前面, 还是将49 写在前面? 如果将6C 写在前面, 就是bi g endi an。 还是将49 写在前面, 就是 l i ttl e endi an。 “endi an” 这个词出自《格列佛游记》 。 小人国的内战就源于吃鸡蛋时是究竟从大 头 (Bi g-Endi an)敲开还是从小头(Li ttl e-Endi an)敲开, 由此曾发生过六次叛乱, 其中一个皇帝送了命, 另一个丢了王位。我们一般将endi an 翻译成“字节序” , 将bi g endi an 和 l i ttl e endi an 称作“大尾” 和“小尾” 。 1 、 字符编码、 内码, 顺带介绍汉字编码字符必须编码后才能被计算机处理。 计算机使用的缺省 编 码方式就是计算机的内码。 早期的计算机使用 7 位的 ASCI I 编码, 为了处理汉字, 程序员设计了用于简体中文的 GB231 2 和用于繁体中文的 bi g5。 GB231 2(1 980 年)一共收录了 7445 个字符, 包括6763 个汉字和 682 个其它符号。 汉字区的内码范围高字节从B0-F7, 低字节从A1 -FE, 占用的码位是 72*94=6768。 其中有5 个空位是D7FA-D7FE。 GB231 2 支持的汉字太少。 1 995 年的汉字扩展规范GBK1 . 0 收录了 21 886 个符号, 它分为汉字区和图形符号区。 汉字区包括21 003 个字符。 2000 年的 GB1 8030 是取代GBK1 . 0 的正式国家标准。 该标准收录了 27484 个汉字, 同时还收录了藏文、 蒙文、 维吾尔文等主要的少数民族文字。 现在的PC 平台必须支持 GB1 8030, 对嵌入式产品暂不作要求。 所以手机、 MP3 一般只支持GB231 2。从ASCI I 、 GB231 2、 GBK 到GB1 8030, 这些编码方法是向下兼容的, 即同一个字符在这些方案中总是有相同的编码, 后面的标准支持更多的字符。 在这些编码中, 英文和中文可以统一地处理。 区分中文编码的方法是高字节的最高位不为 0。 按照程序员的称呼, GB231 2、 GBK 到GB1 8030 都属于双字节字符集 (DBCS)。有的中文Wi ndows 的缺省内码还是GBK, 可以通过GB1 8030 升级包升级到 GB1 8030。 不过GB1 8030 相对GBK 增加的字符, 普通人是很难用到的, 通常我们还是用 GBK 指代中文Wi ndows 内码。这里还有一些细节: GB231 2 的原文还是区位码, 从区位码到内码, 需要在高字节和低字节上分别加上A0。在DBCS 中, GB 内码的存储格式始终是bi g endi an, 即高位在前。 GB231 2 的两个字节的最高位都是1 。 但符合这个条件的码位只有 1 28*1 28=1 6384 个。 所以 GBK 和 GB1 8030 的低字节最高位都可能不是1 。 不过这不影响 DBCS 字符流的解析: 在读取DBCS 字符流时, 只要遇到高位为 1 的字节, 就可以将下两个字节作为一个双字节编码, 而不用管低字节的高位是什么。 2、 Uni code、 UCS 和 UTF 前面提到从ASCI I 、 GB231 2、 GBK 到GB1 8030 的编码方法是向下兼容的。 而 Uni code 只与 ASCI I 兼容(更准确地说, 是与 I SO-8859-1 兼容) , 与 GB 码不兼容。 例如“汉” 字的 Uni code 编码是6C49, 而GB 码是BABA。 Uni code 也是一种字符编码方法, 不过它是由国际组织设计, 可以容纳全世界所有语言文字的编码方案。 Uni code 的学名是"Uni versal Mul ti pl e-Octet Coded Character Set", 简称为 UCS。 UCS 可以看作是"Uni code Character Set"的缩写。根据维基百科全书(http: //zh. wi ki pedi a. org/wi ki /)的记载: 历史上存在两个试图独立设计Uni code 的组织, 即国际标准化组织(I SO) 和一个软件制造商的协会(uni code. org) 。 I SO 开发了 I SO 1 0646 项目, Uni code 协会开发了 Uni code 项目。在1 991 年前后, 双方都认识到世界不需要两个不兼容的字符集。 于是它们开始合并双方的工作成果, 并为创立一个单一编码表而协同工作。 从Uni code2. 0 开始, Uni code 项目采用了与 I SO 1 0646-1 相同的字库和字码。目前两个项目仍都存在, 并独立地公布各自的标准。 Uni code 协会现在的最新版本是2005 年的 Uni code 4. 1 . 0。 I SO 的最新标准是1 0646-3: 2003。 UCS 规定了怎么用多个字节表示各种文字。 怎样传输这些编码, 是由 UTF(UCS Transformati on Format)规范规定的, 常见的 UTF 规范包括 UTF-8、 UTF-7、 UTF-1 6。 I ETF 的 RFC2781 和 RFC3629 以 RFC 的一贯风格, 清晰、 明快又不失严谨地描述了 UTF-1 6 和 UTF-8 的编码方法。 我总是记不得I ETF 是I nternet Engi neeri ng Task Force 的缩写。 但I ETF 负责维护的 RFC 是I nternet 上一切规范的基础。 3、 UCS-2、 UCS-4、 BMP UCS 有两种格式: UCS-2 和 UCS-4。 顾名思义, UCS-2 就是用两个字节编码, UCS-4 就是用 4 个字节(实际上只用了 31 位, 最高位必须为 0) 编码。 下面让我们做一些简单的数学游戏: UCS-2 有2^1 6=65536 个码位, UCS-4 有2^31 =21 47483648 个码位。 UCS-4 根据最高位为 0 的最高字节分成2^7=1 28 个group。 每个group 再根据次高字节分为 256 个pl ane。 每个pl ane 根据第3 个字节分为 256 行 (rows), 每行包含256 个cel l s。 当然同一行的 cel l s 只是最后一个字节不同, 其余都相同。 group 0 的 pl ane 0 被称作Basi c Mul ti l i ngual Pl ane, 即 BMP。 或者说UCS-4 中,高两个字节为 0 的码位被称作BMP。将UCS-4 的 BMP 去掉前面的两个零字节就得到了 UCS-2。 在UCS-2 的两个字节前加上两个零字节, 就得到了 UCS-4 的 BMP。 而目前的 UCS-4 规范中还没有任何字符被分配在BMP 之外。 4、 UTF 编码 UTF-8 就是以 8 位为单元对UCS 进行编码。 从UCS-2 到UTF-8 的 编码方式如下: UCS-2 编码(1 6 进制) UTF-8 字节流(二进制) 0000 - 007F 0xxxxxxx 0080 - 07FF 11 0xxxxx 1 0xxxxxx 0800 - FFFF 111 0xxxx 1 0xxxxxx 1 0xxxxxx 例如“汉” 字的 Uni code 编码是6C49。 6C49 在0800-FFFF 之间, 所以肯定要用 3 字节模板了: 111 0xxxx 1 0xxxxxx 1 0xxxxxx。 将6C49 写成二进制是: 011 0 11 0001 001 001 , 用这个比特流依次代替模板中的 x, 得到: 111 0011 0 1 011 0001 1 0001 001 , 即 E6 B1 89。读者可以用记事本测试一下我们的编码是否正确。 UTF-1 6 以 1 6 位为单元对UCS 进行编码。 对于小于0x1 0000 的 UCS 码, UTF-1 6 编码就等于UCS 码对应的 1 6 位无符号整数。 对于不小于0x1 0000 的 UCS 码, 定义了一个算法。 不过由于实际使用的 UCS2, 或者UCS4 的 BMP 必然小于0x1 0000, 所以就目前而言, 可以认为 UTF-1 6 和 UCS-2 基本相同。 但 UCS-2 只是一个编码方案, UTF-1 6 却要用于实际的传输, 所以就不得不考虑字节序的问题。 5、 UTF 的字节序和 BOM UTF-8 以字节为编码单元, 没有字节序的问题。 UTF-1 6 以两个字节为编码单元,在解释一个UTF-1 6 文本前, 首先要弄清楚每个编码单元的字节序。 例如收到一个“奎” 的 Uni code 编码是594E, “乙” 的 Uni code 编码是4E59。 如果我们收到UTF-1 6 字节流“594E”, 那么这是“奎” 还是“乙” ? Uni code 规范中推荐的标记字节顺序的方法是BOM。 BOM 不是“Bi l l Of Materi al ”的 BOM 表, 而是Byte Order Mark。 BOM 是一个有点小聪明的想法:在UCS 编码中有一个叫做"ZERO WI DTH NO-BREAK SPACE"的字符, 它的编码是FEFF。 而FFFE 在UCS 中是不存在的字符, 所以不应该出现在实际传输中。 UCS 规范建议我们在传输字节流前, 先传输字符"ZERO WI DTH NO- BREAK SPACE"。这样如果接收者收到FEFF, 就表明这个字节流是Bi g-Endi an 的; 如果收到 FFFE, 就表明这个字节流是Li ttl e-Endi an 的。 因此字符"ZERO WI DTH NO- BREAK SPACE"又被称作BOM。 UTF-8 不需要BOM 来表明字节顺序, 但可以用 BOM 来表明 编码方式。 字符"ZERO WI DTH NO-BREAK SPACE"的 UTF-8 编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下) 。 所以如果接收者收到以 EF BB BF 开头的字节流, 就知道这是UTF-8 编码了。 Wi ndows 就是使用 BOM 来标记文本文件的 编码方式的。汉字编码是认为定义一组汉字的顺序 表。 目前常用的 gb231 2, gb1 3000, gbk, bi g5, 和 uni code. 机器内码是汉字编码在计算机里面的具体表示编码, 他和汉字编码是有固定对应关系的。 现在wi ndow常用的是gbk, 他是gb231 2 的兼容超集。 我们以 gb231 2 为例。 gb231 2 定义汉字编码分为区码和位码, 分别是从1 ~94. 所以 gb231 2 的编码容量是94*94 个汉字, 实际上只定义了 6763 个汉字, 1 ~9 区是特殊字符, 包括全角的标点、 字母、 日文、 希腊文、 俄文等等 1 6~87 是汉字区。 如果计算机要表示汉字, 只能用现有的计算机编码表示, 这就有了机内码的概念。 计算机是以字节为单位, 只能表示0~255. (asc 定义了 0~1 27), 所以汉字就用 2 各连续字节表示一个汉字, 为了和 0~1 27 的 asc 分开, 采用了从0xa0 开始到 0xfe 的这部分。 就得到了机内码和汉字区位码的对应关系 机内码 = 0xa0 + 区码, 0xa0 + 位码; 如果一个汉字的机内码是 0xb0a1 那么它对应的区位码就是 0xb0-0xa0= 0x1 0=1 6, 0xa1 -0xa0= 1 , 他的区位码是 1 601 , 就是汉字"啊" 反过来一样. 这种机内码表示方式有个问题就是一个汉字等于2 个asc 码, 不利于计算字符串长度, 还一个问题(在dos 下最明显) 就是西文造表符的识别。 现在的 gbk 已经比这个复杂了, 你理解了 gb231 2 的, gbk 就容易了。 现在的趋势是uni code, 他是1 6 位内码, 包括asc 码都扩充到1 6 位了, 他是世界通用的字符集。 容量是65534 个字符, 包含了世界各国的文字。计算机中字符的编码西文字符的编码计算机中的信息都是用二进制编码表示的。 用以表示字符的二进制编码称为字符编码。 计算机中常用的字符编码有EBCDI C 码和 ASCI I 码。 I BM 系统大型机采用 EBCDI C 码, 微型机采用 ASCI I 码。 ASCI I 码是美国标准信息交换码, 被国际标准化组织(I SO) 指定为国际码 。 ASCI I 码有7 位码和 8 位码两种版本。 国际通用的7 位ASCI I 码称为 I SO-646 标准, 用 7 位二进制表示一个字符的编辑, 其编码范围从0000000B-1111111 B,共有27=1 28 个不同的编码值, 相应可表示1 28 个不同的字符编码。如数字“0”的 ASCI I 码值为 011 0000B(或48D 或30H) , 字母“A”的码值为 1 000001 B(或65D 或41 H) , “a”的码值为 11 00001 B(或97D 或61 H) 等 。 1 28 个编码中有34 个控制符的编码(00H-20H 和 7FH) 和 94 个字符编码(21 H-7EH) 。 计算机内部用一个字节(8 个二进制位) 存放一个7 位ASCI I 码,最高位b7 置为 0。扩展的 ASCI I 码使用 8 个二进制位表示一个字符的编码, 可表示28=256 个不同字符的编码。汉字的编码 ASCI I 码只给出了英文字母、 数学和标点符号的编码。 为了用计算机处理汉字,同样需要对汉字进行编码。 1 . 汉字信息交换码(国标码)汉字信息交换码是用于汉字信息处理系统之间或者与通信系统进行信息交换的汉字代码, 简称交换码, 也叫国标码。 我国 1 981 年颁布了国家标准《信息交换用汉字编码字符集——基本集》 , 代号为 GB231 2-80, 即国标码。 2. 汉字输入码为将汉字输入计算机而编制的代码称为汉字输入码, 也叫外码。 3. 汉字内码汉字内码是在计算机内部对汉字进行存储、 处理和传输的汉字代码, 它应能满足存储、 处理和传输的要求。 当一个汉字输入计算机后就转换为内码, 然后才能在机器内流动、 处理。 汉字内码的形式也多种多样。 目前, 对应于国标码, 一个汉字的内码也用 2 个字节存储, 并把每个字节的最高二进制位置“1 ”作为汉字内码的标识, 以免与单字节的 ASCI I 码产生歧义性。 如果用十六进制来表述, 就是把汉字国标码的每个字节上加一个80H(即二进制数1 0000000) 。 所以, 汉字的国标码与其内码有下列关系:汉字的内码=汉字的国标码+8080H 例如, 已知“中” 字的国标码为 5650H, 则根据上述公式得: “中” 字的内码=“中” 字的国标码5650H+8080H=D6D0H。 4. 汉字字形码经过计算机处理的汉字信息, 如果要显示打印出来阅读, 则必须将汉字内码转换成人们可读的方块汉字。 每个汉字的字形信息是预先存放在计算机内的, 常称汉字库。 汉字内码与汉字字形一一对应。 描述汉字字形的方法主要有点阵字形和轮廓字形两种。计算机中, 8 个二进制位组成一个字节, 字节是度量存储空间的基本单位。 可见一个1 6X1 6 点阵的字形需要1 6X1 6/8=32 字节存储空间; 理, 24X24 点阵的字形码需要24X24/8=72 字节存储空间; 32X32 点阵的字型有码城要 32X32/8=1 28 字节存储空间。汉字的点阵字形的缺点是放大后会出现锯齿现象, 很不美观。轮廓字形方法比前者复杂, 一个汉字中笔画的轮廓可用一组曲线来勾画, 它采用数学方法来描述每个汉字的轮廓曲线。 中文Wi ndows 下广泛采用的 TrueType 字形库就是采用轮廓字形法。 这种方法的优点是字形精度高, 且可以任意放大、缩小而不产生锯齿现象; 缺点是输出之前必须经过复杂的数学运算处理。 5. 汉字地址码汉字地址码是指汉字字库(这里主要指整字形的点阵式字模库) 中存储汉字字形信息的逻辑地址码。 6. 各种汉字代码之间的关系汉字的输入、 处理和输入的过程, 实际上是汉字的种种代码之间的转换过程, 或者说汉字代码在系统有关部件之间流动的过程。 7. 汉字字符集简介 GB 231 2-80 汉字编码 GB 231 2-80 码×××国家标准汉字信息交换换用编码, 全称《信息交换用汉字编码字符集——基本集》 , 标准号为 GB 231 2-80, 由×××家标准总局发布, 1 981 年5 月 1 日实施, 习惯上称国标码、 GB 码或区位码。 它是一个简化汉字的编码, 通行于中国大陆地区, 新加坡等地也使用这一编码。 GBK 编码 GBK 是又一个汉字编码标准, 全称《汉字内码扩展规范》 , ×××全国信息技术标准化技术委员会1 995 年1 2 月 1 日制订。 Uni code 和 CJK 编码 I SO1 0646 是国际标准化组织(I SO) 公布的一个编码标准Uni versal Coded Character Set(简称UCS), 译为《通用编码字符集》 。 GB 1 8030-2000 编码 BI G-5 码 BI G-5 码是通行于台湾、 香港地区的一个繁体字编码方案, 俗称“大五码” 。 它被广泛地应用于电脑业和因特网(I nternet) 中, 是一个双字节编码方案, 收录了 1 3461 个符号和汉字, 其中包括408 个符号和 1 3053 个汉字。 汉字分5401 个常用字和 7652 个次常用字两部分, 各部分中的汉字按笔画/部首排列。然而, 对于汉字, 我们的电脑上转换成的是机内码, 机内码是如何得到的呢?下面做一下简单介绍:机内码 = 国标码 + 8080H + 2020H PS: 其中国标码要把区玛和位码分开, 而且都看成1 0 进制, 然后转换成十六进制, 比如: “丁” 的区位码是22 01 , 则转换成1 6 进制为 1 6H(22) 01 H(01 ) , 则转换成机内码是: (1 601 ) H + (A0A0) H) = (B6A1 ) H 另外: 还有一个叫国际码的, 就是美国编码, 计算如下:国际码 = 区位码 + 2020H PS: 其中计算方法与机内码相似: 比如, “丁” 的编码就是--(3601 ) H