字符编码之Unicode

在现代电子计算机中,无论字符,图像,声音的所有表示的底层皆是二进制码,为了使全国更加容易的通信,为了使互联网更加面向世界,于是ISO组织推出了“Universal Multiple-Octet Coded Character Set” ,简称“UCS”,俗称“Unicode”。中文名也就是万国码/国际码/统一码。

一、Unicode编码方案之UCS-2

目前Unicode编码方案使用最广泛的是UCS-2,也就是使用2个字节表示字符的编码方案,这样一来该编码方案能表示2^16=65536种字符,基本满足了大部分语言的正常使用。具体方案在维基百科中有详细表单。

二、Unicode编码方案之UCS-4

为了能表示全世界所有的文化符号,又出现了UCS-4的编码方案,也就是UCS-2的拓展实现。具体实现为:
1.UCS-4的首位恒为 0 ,也就是UCS-4可以表示 2^31 种字符。
2.UCS-4将这个区间划分为17个平面,而每个平面拥有65536个代码点,然而目前只用了少数平面。0号平面也就是UCS-2的字符集,具体如下图所示:
这里写图片描述
3.在字符平面中,第0平台又称为基本平面,另外的平面称为辅助平面。

三、Unicode编码之计算机上的实现

在上文中简要说明了Unicode编码的方案,编码方案只规定了Unicode码和字符间的映射关系,并没有给出具体的计算机形式的存储传输方案,所以在计算机上使用Unicode编码又有多种不同的实现方案。

那么在计算机中该编码方案又是怎样实现的呢?很容易想到,一个字符的实现为两个字节,那么最朴素的实现就是直接连续传送字节即可。这种实现方案也就是UTF-16。很容易想象,这种编码方案会将英文的存储空间变为原来的两倍,会大幅影响网络传输速率,并且两字节的编码方案如果在网络传输时漏掉一个字节则可能会丢失大量信息。所以这种实现方案不适合网络传输。但是UTF-16大部分字符都是定长的,只有部分辅助字符是四字节的,所以使用计算机操作,处理这种字符串会比较效率和容易。JAVA虚拟机保存字符串所使用的编码就是UTF-16。我们知道计算机读取数据时分为大端和小端,他们使用不同的顺序读取数据,所以UTF-16也分成了UTF-16(LE)小端模式,和UTF-16(BE)大端模式,在Windows中默认使用的是小端模式的实现。

还有一种常用的实现,也就是UTF-8,这种实现采用的变长方式存储的Unicode编码,具体实现为:

U+ 0000 ~ U+ 007F: 0XXXXXXX
U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX

从上面可以看出,UTF-8的长度范围为1~4个字节。
第一个区间需要一个字节,可以存储2^7=128个字符,和ASCII兼容
第二个区间需要两个字节,可以存储2^11=2048个字符
第三个区间需要三个字节,可以存储2^16=65536个字符,中文字符就在此区间
第四个区间需要四个字节,可以存储2^21=2097152个字符,很明显是用于存储UCS-4编码方案中的辅助平面的字符的

四、Unicode术语列表

一、代码点

二、代码单元

五、其它编码

除了Unicode编码以外,我们使用最多的应该还有GBK系列编码(GBK的意思为国标扩的拼音首字母)
GBK系列的编码发展为:

GBK2313 -> GBK -> GB18030

这套编码方案是基于ASCII的扩展,而又由于这套编码方案是不兼容Unicode的,所以需要谨慎使用。
该编码使用的是变长表示法,但处理过程很简单:如果第一个字节大于127则代表这是一个双字节表示的汉字,否则是英文符号。该方案中所有中文使用两个字节存储,原ASCII字符还是一个字节,从版本发展顺序中编码方案所容纳的字符越来越多。
在面对用户群体都是中国人时可以使用该编码方案,他比UTF-8的优势是传输中文时少了1/3的传输量。

六、参考资料

https://www.zhihu.com/question/23374078 -知乎Unicode和UTF8的区别
https://zh.wikipedia.org/wiki/Unicode -Unicode维基百科
http://utf8everywhere.org/zh-cn -Utf8遍地开花
https://blog.csdn.net/wjheha/article/details/70072027?locationNum=9&fps=1 -个人博客,讲解各字符编码间的关系
https://www.cnblogs.com/malecrab/p/5300503.html -个人博客,同上
https://www.jianshu.com/p/07b578adfbf8 -简书 Unicode详解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值