DBCS(Double-Byte Character Set, 双位元组字元集)
前提:
- 早年的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, 双位元组字元集)相关推荐
- MySQL入门 (六) : 字元集与资料库
1 Character Set与Collation 任何资讯技术在处理资料的时候,如果只是单纯的数值和运算,那就不会有太复杂的问题:如果处理的资料是文字的话,就会面临世界上各种不同语言的问题. 以资料 ...
- java中String与int/float/double/byte/数组
原文链接:小宁博客[添加链接描述](https://www.sunxiaoning.com/language/634.html) int转换为String(int i=100) 第一种方法:s=i+& ...
- illegal base64 character 3a_双11华硕多款产品再送豪礼 高端硬件通吃最新3A大作
原标题:双11华硕多款产品再送豪礼 高端硬件通吃最新3A大作 11月里,除去已经宣布跳票的<赛博朋克2077>这款作品,包括<刺客信条:英灵殿><极品飞车:热力追踪> ...
- Android用Double Array Trie (双数组)实现关键字的搜索
我们项目本想用这种方法做Android的搜索提示用,也就是,在搜索框中输入一个关键字,下面自动检索出和输入的关键词匹配的关键字,提示用户,用户可以方便的从下面的提示中选择出自己想要的关键字.提高用户体 ...
- 【转】刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK等)以及全角、半角、CJK
一.概述 1. 英文字母再加一些其他标点字符之类的也不会超过256个,用一个字节来表示一个字符就足够了(2^8 = 256).但其他一些文字不止这么多字符,比如中文中的汉字就多达10多万个,一个字节只 ...
- UINCODE字符串和安全字符串函数(好)
[原]UINCODE字符串和安全字符串函数 字符集基础知识 在计算机中,字符都是以二进制编码方式存在于存储中 编码与解码 将字符输入计算机存储的过程类似于一个"编码"的过程 而将对 ...
- FatFs 之二 路径规则、字符编码、编码页、卷管理详解
写在前面 本文的内容部分来自于 FatFs 的官方文档,但是添加了一些额外的章节及内容.其并不是原版 FatFs 的官方文档的翻译.如果关注与 FatFs 的官方文档,请从本文的 参考 章节前去查看即 ...
- 字符编码详解——彻底理解掌握编码知识,“乱码”不复存在
每一个程序员都不可避免的遇到字符编码的问题,特别是做Web开发的程序员,"乱码问题"一直是让人头疼的问题,也许您已经很少遇到"乱码"问题,然而,对解决乱码的方法 ...
- 听微软老员工讲述他们是如何走进微软的
对于 微软亚洲研究院九年的建院历史而言,工作十年以上的员工并不多,邹欣便是这为数不多中的一员.他在美国获得计算机硕士学位后便与微软结缘,先后在微软总部参与开发了Outlook, Visual Stud ...
最新文章
- Linux 内核源代码的目录结构
- vcpkg安装_微软牌包管理器vcpkg更新及路线图计划
- 【深度揭秘】百度、阿里、腾讯内部岗位级别和薪资结构,附带求职建议!
- ubuntu之Matlab安装
- python matplotlib 播放图片变化过程
- 阿里开源深度学习框架XDL,面向高维稀疏数据,支持千亿参数训练规模
- java中的正则操作总结
- 淘宝客APP带自营商城本地生活CPS外卖优惠电影票话费更新渠道跟单生活特权V3
- java学习——JavaScript入门
- 有什么好用的电脑录音软件?
- Rob Knight: PCR不需要做三个平行再混合!
- OpenGrok简单使用
- 折腾修改SQLCipher静态库的符号表
- QA是干什么的?(职责所在????)
- 计算机中文核心期刊哪个快,计算机中文核心期刊要多久cpci加急,又快又水的sci期刊...
- 欧拉角、万向节死锁理解
- trunk vlan pvid 学习实验整理 1
- 【MySQL】的优化 pymysql操作 JDBC操作
- 程序员之路:C语言typedef和struct
- 添加到收藏夹js(兼容ie/ff/op)不兼容chrome求解决