UTF-8 & UTF-16 & Unicode

C# 使用 Unicode 编码处理字符和字符串。 char 类型表示 UTF-16 代码单元,string 类型表示一系列 UTF-16 代码单元。

所以查询了一下相关的编码知识

总结如下

Unicode – 可以想象为一种字符与位置一一对应的表格

亘古之初 – ASCII,后来ASCII因为种种原因(简单来说,应该就是跟不上时代发展了),不太够用了。所以就产生了Unicode

Unicode是一个编码方案,Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求

目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个(其实不全对)。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案

主要知识点应该是 17个平面、第0平面有个专有名称–基本多文种平面,又叫plane 0、每平面拥有65536个码位,共1114112个。但是plane 0 有一部分码位没用到

UTF-8 – 针对Unicode的一种可变长度字符编码

UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。

主要知识点应该是 兼容ASCII、编码长度可变,且中文字符因为在Unicode上的位置的原因,大部分在UTF-8的编码格式中占据3个字节、读取方式基本靠编码首位是0还是1

UTF-16 – 针对Unicode的一种字符编码

可以分为两种形式

第一种
当字符的编码在Unicode上 <0x10000时,U的UTF-16编码就是U对应的16位无符号整数

第二种
当字符的编码在Unicode上 ≥0x10000时,UTF-16搞了一波骚操作,将这个编码分成了上下两段,每段都放在两个字节中,总计使用四个字节(32bit)去表示一个字符。

因为在当前的Unicode编码长度中,当一个字符的编码 减去(-) 0x10000后不会超过20bit,所以这个上下段是平均分的,上下段各分10bit。

问题在于当你各分10bit到上下两段时,每段为两个字节,总计是16bit,剩下6bit怎么填充呢?所以是使用了110110xxxxxxxxxx(高位替代),110111yyyyyyyyyy(低位替代)这种表述形式,就是添加了一个前缀

好了,高位Unicode字符的表述问题解决了,但是有一个新问题,就是Unicode低位字符,即字符对应位置处于1101100000000000 - 101111111111111之间的字符没办法去表述了,怎么解决呢?空着就行了( ̄▽ ̄)"

所以,在Unicode中1101100000000000 - 101111111111111这个位置区间没有编任何对应的字符,也就不会混淆了。

所以,在Unicode 的plane0里面就有一段位置并没有编任何对应的字符,就空着了,而这样也就使得Unicode的有效码位其实并不是(1114112)个,而是(1114112/十进制 - 1101100000000000 到 101111111111111中间的位数)个,有兴趣可以自己算下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值