unicode和unicode编码
unicode编码是什么?
这其实是两个问题,unicode 是什么什么?unicode是怎样编码的?
Unicode provides a unique number for every character, no matter what the platform, no matter what the program, no matter what the language.
unicode 为每⼀个字符提供了唯⼀的编号,不区分平台,程序和语⾔
百度百科:
Unicode(统⼀码、万国码、单⼀码)是计算机科学领域⾥的⼀项业界标准,包括字符集、编码⽅案等。Unicode 是为了解决传统的字符编码⽅案的局限⽽产⽣的,它为每种语⾔中的每个字符设定了统⼀并且唯⼀的⼆进制编码,以满⾜跨语⾔、跨平台进⾏⽂本转换、处理的要求。
Unicode 当然是⼀本很厚的字典,记录着世界上所有字符对应的⼀个数字。具体是怎样的对应关系,⼜或者说是如何进⾏划分的,就不是我们考虑的问题了,我们只⽤知道 Unicode 给所有的字符指定了⼀个数字⽤来表⽰该字符。
Unicode 编码⽅案
Unicode其实仅仅只是⼀个字符集,规定了符合对应的⼆进制代码,⾄于这个⼆进制代码如何存储则没有任何规定。它的想法很简单,就是为每个字符规定⼀个⽤来表⽰该字符的数字,仅此⽽已。
Unicode 没有规定字符对应的⼆进制码如何存储。以汉字“汉”为例,它的 Unicode码点1 是 0x6c49,对应的⼆进制数是110110*********,⼆进制数有 15 位,这也就说明了它⾄少需要 2 个字节来表⽰。可以想象,在 Unicode 字典中往后的字符可能就需要 3个字节或者 4 个字节,甚⾄更多字节来表⽰了。
这就导致了⼀些问题,计算机怎么知道你这个 2 个字节表⽰的是⼀个字符,⽽不是分别表⽰两个字符呢?这⾥我们可能会想到,那就取个最⼤的,假如 Unicode 中最⼤的字符⽤ 4 字节就可以表⽰了,那么我们就将所有的字符都⽤ 4 个字节来表⽰,不够的就往前⾯补 0。这样确实可以解决编码问题,但是却造成了空间的极⼤浪费,如果是⼀个英⽂⽂档,那⽂件⼤⼩就⼤出了 3 倍,这显然是⽆法接受的。
于是,为了较好的解决 Unicode 的编码问题, UTF-8 和 UTF-16 两种当前⽐较流⾏的编码⽅式诞⽣了。当然还有⼀个 UTF-32 的编码⽅式,也就是上述那种定长编码,字符统⼀使⽤ 4 个字节,虽然看似⽅便,但是却不如另外两种编码⽅式使⽤⼴泛。
UTF-8
UTF-8 是⼀个⾮常惊艳的编码⽅式,漂亮的实现了对 ASCII 码的向后兼容,以保证 Unicode 可以被⼤众接受。
UTF-8 是⽬前互联⽹上使⽤最⼴泛的⼀种 Unicode 编码⽅式,它的最⼤特点就是可变长。它可以使⽤ 1 - 4 个字节表⽰⼀个字符,根据字符的不同变换长度。编码规则如下:
1. 对于单个字节的字符,第⼀位设为 0,后⾯的 7 位对应这个字符的 Unicode 码点。因此,对于英⽂中的 0 - 127 号字符,与 ASCII 码
完全相同。这意味着 ASCII 码那个年代的⽂档⽤ UTF-8 编码打开完全没有问题。
2. 对于需要使⽤ N 个字节来表⽰的字符(N > 1),第⼀个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设
位 10,剩下的⼆进制位则使⽤这个字符的 Unicode 码点来填充。
编码规则如下:
Unicode ⼗六进制码点范围UTF-8 ⼆进制
0000 0000 - 0000 007F0xxxxxxx
0000 0080 - 0000 07FF110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
根据上⾯编码规则对照表,进⾏ UTF-8 编码和解码就简单多了。下⾯以汉字“汉”为利,具体说明如何进⾏ UTF-8 编码和解码。unicode汉字
“汉”的 Unicode 码点是 0x6c49(110 1100 0100 1001),通过上⾯的对照表可以发现,0x0000 6c49位于第三⾏的范围,那么得出其格式为1110xxxx 10xxxxxx 10xxxxxx。接着,从“汉”的⼆进制数最后⼀位开始,从后向前依次填充对应格式中的 x,多出的 x ⽤ 0 补上。这样,就得到了“汉”的 UTF-8 编码为11100110 10110001 10001001,转换成⼗六进制就是0xE6 0xB7 0x89。
解码的过程也⼗分简单:如果⼀个字节的第⼀位是 0 ,则说明这个字节对应⼀个字符;如果⼀个字节的第⼀位1,那么连续有多少个 1,就表⽰该字符占⽤多少个字节。
对unicode 感兴趣的话,可以阅读
unicode的渊源:
[1] 码点是Unicode标准中很重要的⼀个概念。⽬前它的取值范围是⼗六进制的0x0~0x10FFFF,换算成⼗进制是0~1114111,共计1114112个。需要注意的是,⼀个单⼀的抽象字符可能对应⼀个以上的码位。例如,Ω既可以表⽰⼤写的希腊字母Omega,码位是U+03A9,也可以表⽰物理学中的欧姆符号,码位是U+2126。
>>> '\u03a9'
'Ω'
>>> '\u2126'
'Ω'
单个抽象字符也可以由⼀系列码位的序列来表⽰。例如,é的码位是U+00E9,它也可以由⼩写字母e(码位为U+0065)'(Combining Acute Accent)(码位为U+0301)组合⽽成。
>>> '\u00e9'
'é'
>>> '\u0065\u0301'
'e'
在Unicode标准中,码点的表⽰⽅法通常是使⽤它们的⼗六进制,并加上U+前缀。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论