迄今为止,我们已经看到了256个字元的字元集。但中国、日本和韩国的象形文字符号有大约21,000个。如何容纳这些语言而仍保持和ASCII的某种相容性呢?
解决方案(如果这个说法正确的话)是双位元组字元集(DBCS:double-byte character set)。DBCS从256代码开始,就像ASCII一样。与任何行为良好的内码表一样,最初的128个代码是ASCII。然而,较高的128个代码中的某些总是跟随著第二个位元组。这两个位元组一起(称作首位元组和跟随位元组)定义一个字元,通常是一个复杂的象形文字。
虽然中文、日文和韩文共用一些相同的象形文字,但显然这三种语言是不同的,而且经常是同一个象形文字在三种不同的语言中代表三件不同的事。Windows支援四个不同的双位元组字元集:内码表932(日文)、936(简体中文)、949(韩语)和950(繁体汉字)。只有为这些国家(地区)生产的Windows版本才支援DBCS。
双字元集问题并不是说字元由两个位元组代表。问题在于一些字元(特别是ASCII字元)由1个位元组表示。这会引起附加的程式设计问题。例如,字串中的字元数不能由字串的位元组数决定。必须剖析字串来决定其长度,而且必须检查每个位元组以确定它是否为双位元组字元的首位元组。如果有一个指向DBCS字串中间的指标,那么该字串前一个字元的位址是什么呢?惯用的解决方案是从开始的指标分析该字串。
DBCS故名思义就是用两个byte表示一个字符,是对各种采用两个byte表示一个字符(好像哪里重复了)的内码方案的一个统称。首先要明确的是先有各种双字节编码方案后有DBCS这个(概括性的)名字,DBCS并没有统一的规范,不存在通行的标准。只是早年使用DBCS的各国为了达到类似的目的,最后搞出来的方案大都类似而已。

前提:

  • 早年的ASCII只定义了128个字符(可打印的96个),剩下最高位为1的128个码位算是空出来的
  • IBM搞PC机的时候定义了codepage 437,把高128个码位也用上了,放了各种制表符还有笑脸箭头黑桃红桃梅花方块啥的
  • 就算不管cp437,一个byte里剩下的码位最多也只能表示128个字符,中日韩不够用

基于以上的前提,很自然而然会想到的一种办法就是用两个byte来表示一个字符。ASCII不是空出来了高128个码位吗?第一个byte在这高128里取值,再和第二个byte结合就可以表示最多128x256=32768个字符了。程序在处理字符串的时候,遇到有byte<128的就认为是ASCII,遇到>=128的就把下一个byte也读进来,换算成一个字符。

所以双字节字符虽然保持了和ASCII的兼容性,但天生就和CP437冲突。在具体的编码方案上,各国因地制宜因陋就简因为爱所以爱的制定了不同的方案:

  • 我国的GB2312:
    GB2312诞生于1980年代初,是一个非常克制的码表,高低两个byte都只使用了0xA0到0xFD这一段共94个码位,最大可表示94x94=8836个字符,但其中有若干空位,实际只定义了6763个汉字各种全角字母标点符号等等。早年DOS下的外挂汉字操作系统大多有造字程序,用户可自行指定使用GB2312中未用的码位(当然换台电脑就不行啦)。

    所以对GB2312而言,0x80到0xBF以及0xFE-0xFF的码位是空出来的,相信这也是为了尽最大可能减小和CP437的冲突。主要是CP437里的制表符被覆盖了。

    GB2312只包含最常用的不到七千个汉字,我打赌在看这个回答的人里一定有自己的名字不在GB2312里,高考报名遇到过麻烦的。为了表示更多汉字,GB2312后来扩展了码位变成GBK,占用的码位和下面两个大致类似。

  • 繁体BIG5:
    BIG5的高byte(这里说的高都是以big endian而言)范围为0x81到0xF9,低byte为0x40到0x7E和0xA1到0xFE。注意,GB2312要表示的汉字比较少,两个byte都放到了高128段,这对BIG5远远不够,因而低byte不得不也使用ASCII的低128段。不过程序处理起来也和GB2312没什么区别,反正是以高byte为标志。
  • 日文Shift-JIS:
    SJIS本身不仅仅是DBCS方案,也包括对单字节ASCII表的重定义,但这里只说双字节。和BIG5类似,SJIS的高byte是0x80到0xFF,低byte也同时占用了0x40到0x7E和0x80到0xFC。

要特别提一下0x7F,在ASCII里这是表示删除的控制字符,在早期的电传里会用到,所以BIG5和SJIS都专程避开了它。

从上面可以看出,各国的DBCS方案虽然原理类似,但实际占用的码位都有区别,并不是单纯靠检查byte的最高位是不是为1(即大于127)来判断的。例如GB2312,小于0xA0的都不算。

在UTF8还没有流行起来的年代,和各种DBCS打交道很苦逼的。DOS下面很多软件在字符界面下画窗口的时候用到了CP437里的制表符,比如QuickBASIC或TurboC,一旦外挂中文系统开起来就自然而然变成了奇怪的中文。所以那时候的外挂中文系统们又发展出来一种奇怪的能力,就是智能识别当前的内容应该显示成英文制表符还是中文,并且识别准确率还作为一项卖点出现在广告里……

那就更不要说GB2312, BIG5, SJIS混杂的情况了。10多年前我记得大连理工有个年轻老师还开发了一个叫autoconvert的开源软件能智能识别一段文本到底是使用了哪种编码。

作者:rlei
链接:http://www.zhihu.com/question/26502361/answer/33008465
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

DBCS(Double-Byte Character Set, 双位元组字元集)相关推荐

  1. MySQL入门 (六) : 字元集与资料库

    1 Character Set与Collation 任何资讯技术在处理资料的时候,如果只是单纯的数值和运算,那就不会有太复杂的问题:如果处理的资料是文字的话,就会面临世界上各种不同语言的问题. 以资料 ...

  2. java中String与int/float/double/byte/数组

    原文链接:小宁博客[添加链接描述](https://www.sunxiaoning.com/language/634.html) int转换为String(int i=100) 第一种方法:s=i+& ...

  3. illegal base64 character 3a_双11华硕多款产品再送豪礼 高端硬件通吃最新3A大作

    原标题:双11华硕多款产品再送豪礼 高端硬件通吃最新3A大作 11月里,除去已经宣布跳票的<赛博朋克2077>这款作品,包括<刺客信条:英灵殿><极品飞车:热力追踪> ...

  4. Android用Double Array Trie (双数组)实现关键字的搜索

    我们项目本想用这种方法做Android的搜索提示用,也就是,在搜索框中输入一个关键字,下面自动检索出和输入的关键词匹配的关键字,提示用户,用户可以方便的从下面的提示中选择出自己想要的关键字.提高用户体 ...

  5. 【转】刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK等)以及全角、半角、CJK

    一.概述 1. 英文字母再加一些其他标点字符之类的也不会超过256个,用一个字节来表示一个字符就足够了(2^8 = 256).但其他一些文字不止这么多字符,比如中文中的汉字就多达10多万个,一个字节只 ...

  6. UINCODE字符串和安全字符串函数(好)

    [原]UINCODE字符串和安全字符串函数 字符集基础知识 在计算机中,字符都是以二进制编码方式存在于存储中 编码与解码 将字符输入计算机存储的过程类似于一个"编码"的过程 而将对 ...

  7. FatFs 之二 路径规则、字符编码、编码页、卷管理详解

    写在前面 本文的内容部分来自于 FatFs 的官方文档,但是添加了一些额外的章节及内容.其并不是原版 FatFs 的官方文档的翻译.如果关注与 FatFs 的官方文档,请从本文的 参考 章节前去查看即 ...

  8. 字符编码详解——彻底理解掌握编码知识,“乱码”不复存在

    每一个程序员都不可避免的遇到字符编码的问题,特别是做Web开发的程序员,"乱码问题"一直是让人头疼的问题,也许您已经很少遇到"乱码"问题,然而,对解决乱码的方法 ...

  9. 听微软老员工讲述他们是如何走进微软的

    对于 微软亚洲研究院九年的建院历史而言,工作十年以上的员工并不多,邹欣便是这为数不多中的一员.他在美国获得计算机硕士学位后便与微软结缘,先后在微软总部参与开发了Outlook, Visual Stud ...

最新文章

  1. Linux 内核源代码的目录结构
  2. vcpkg安装_微软牌包管理器vcpkg更新及路线图计划
  3. 【深度揭秘】百度、阿里、腾讯内部岗位级别和薪资结构,附带求职建议!
  4. ubuntu之Matlab安装
  5. python matplotlib 播放图片变化过程
  6. 阿里开源深度学习框架XDL,面向高维稀疏数据,支持千亿参数训练规模
  7. java中的正则操作总结
  8. 淘宝客APP带自营商城本地生活CPS外卖优惠电影票话费更新渠道跟单生活特权V3
  9. java学习——JavaScript入门
  10. 有什么好用的电脑录音软件?
  11. Rob Knight: PCR不需要做三个平行再混合!
  12. OpenGrok简单使用
  13. 折腾修改SQLCipher静态库的符号表
  14. QA是干什么的?(职责所在????)
  15. 计算机中文核心期刊哪个快,计算机中文核心期刊要多久cpci加急,又快又水的sci期刊...
  16. 欧拉角、万向节死锁理解
  17. trunk vlan pvid 学习实验整理 1
  18. 【MySQL】的优化 pymysql操作 JDBC操作
  19. 程序员之路:C语言typedef和struct
  20. 添加到收藏夹js(兼容ie/ff/op)不兼容chrome求解决

热门文章

  1. Android解析软件包时出现问题
  2. Java日志门面担当-SLF4J
  3. cadence一些快捷键
  4. 什么是OA系统?OA系统的协同门户平台有哪些特点?
  5. 一大波猪年元素的二维码助你跨猪年!
  6. 手机热点通过蓝牙共享给电脑
  7. html页面内检索,如何用 javascript 实现html页面的关键字搜索?
  8. amCharts 5.2.31 Crack
  9. WPS参考文献自动生成方法
  10. 平台交叉打包 GYP