揭开字符的面纱(一)

在以前,一个字节8位最多表示256个字符(但是计算机字符编码只有0-127的编码。被称为ASCII编码),对于中文汉字是远远不够的。为了支持这些语言文字系统,双字节字符集(double-byte character ser,DBCS)因此而生。在双字节字符集中,一个字符串中的每个字符都有1或2个字符组成。对于这种不确定的字节数我们是很难判断的,Unicode也因此而生,正因为一句老话,存在即合理(自然选择)。

Unicode是1988年Apple和Xerox共同建立的一项标准;1991年成立协会专门开发;对于Unicode完整的描述可参考《The Unicode Standard》这本书。

在Windows Vista中,每个Unicode字符都是采用UTF-16编码(每个字符编码为两个字节);即使统一采用两个字节,有一些汉字还是无法表示,UTF-16支持使用代理(surrogate)4个字节。.NET Framework 始终采用UTF-16来编码所有的字符和字符串,并且在Windows上编码,采用UTF-16开发程序,能够改进性能和减少内存消耗。

UTF-8:曾经我以为UTF-8只是用一个字节来表示字符,对于其中怎么实现一个字节存储那么多汉字却总是心存疑问,有这样想法的同学,希望能够认真看一段。UTF-8仅仅是一种编码标准,并不是说用一个字节或者8位来表示一个字符,而是采用1~4的字符来表示一个字符。比如说有些字符可以用1个字节表示,有些字符可以用2个字符表示,甚至可以用3或4个字符表示。UTF-8不是特定用一个字节或者8位表示,而是1至4个字节。

Unicode字符范围UTF-8字节数UTF-8编码方式
0x0000 ~ 0x00801个字节0xxxxxxx
0x0080 ~ 0x07FF2个字节110xxxxx 10xxxxxx
0x0800 ~0xFFFF3个字节1110xxxx 10xxxxxx 10xxxxxx
代理对4个字节11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8编码规则:
(1)对于ASCII(单字节字符)字符,采用和ASCII相同的编码方式,即只使用一个字节表示,且该字节第一位为0.
(2)对于多字节(2~4字节)字符,假设字节数为n(1 < n <= 4),第一个字节:前n位都设为1,第n+1位设为0;后面的n-1个字节的前两位一律设为10。所有字节中的没有提及的其他二进制位,全部为这个符号的unicode码。

UTF-32:将每个字符都编码为4个字节,从内存角度来看,这种方式并不高效。

国际标准化组织(ISO)及国际电工委员会(IEC)联合制定了一系列8位字符集的标准,统称为ISO 8859(全称ISO/IEC 8859)。注意,这是一系列字符集的统称。如ISO/IEC 8859-1(也就是常听到的Latin-1)支持西欧语言,ISO/IEC 8859-4(Latin-4)支持北欧语言等。
完整列表如下:(摘自百度百科)
ISO/IEC 8859-1 (Latin-1) - 西欧语言
ISO/IEC 8859-2 (Latin-2) - 中欧语言
ISO/IEC 8859-3 (Latin-3) - 南欧语言,世界语也可用此字符集显示。
ISO/IEC 8859-4 (Latin-4) - 北欧语言
ISO/IEC 8859-5 (Cyrillic) - 斯拉夫语言
ISO/IEC 8859-6 (Arabic) - 阿拉伯语
ISO/IEC 8859-7 (Greek) - 希腊语
ISO/IEC 8859-8 (Hebrew) - 希伯来语(视觉顺序)
ISO 8859-8-I - 希伯来语(逻辑顺序)
ISO/IEC 8859-9 (Latin-5 或 Turkish) - 它把Latin-1的冰岛语字母换走,加入土耳其语字母。
ISO/IEC 8859-10 (Latin-6 或 Nordic) - 北日耳曼语支,用来代替Latin-4。
ISO/IEC 8859-11 (Thai) - 泰语,从泰国的 TIS620 标准字集演化而来。
ISO/IEC 8859-13 (Latin-7 或 Baltic Rim) - 波罗的语族
ISO/IEC 8859-14 (Latin-8 或 Celtic) - 凯尔特语族
ISO/IEC 8859-15 (Latin-9) - 西欧语言,加入Latin-1欠缺的芬兰语字母和大写法语重音字母,以及欧元符号。
ISO/IEC 8859-16 (Latin-10) - 东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。

但是西方国家没有想到东方还有一个拥有5000年悠久历史的文明大国,其汉字也是成千上万!!!所以在计算机引入中国后,国家技术监督局设计了GB系列编码方案(GB=guo biao)。GB编码采用两个字节表示一个汉字;同时兼容ASCII编码,规定各个字节的最高位(首位)必须为1,从而避免和最高位为0的ASCII字符集冲突。

编码名称字节数汉字范围
GB2312变字节(ASCII 1字节,汉字2个字节)6763个汉字
GB13000变字节(ASCII 1字节,汉字2个字节)20902个汉字
GBK2个字节21886个汉字和图形符号(含GB2312,BIG5中所有字符)
GB18030变字节(ASCII 1字节,汉字2个或4个字节)27484个汉字

了解字符编码对我们深入理解计算机系统有很大的好处,这也是基础中的基础。如果有错,希望大佬们能够指出,加以改进。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值