unicode

Posted l-h-h

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unicode相关的知识,希望对你有一定的参考价值。

作者:uuspider
链接:http://www.zhihu.com/question/23374078/answer/65352538
来源:知乎

举一个例子:It‘s 知乎日报

你看到的unicode字符集是这样的编码表:
I 0049
t 0074
‘ 0027
s 0073
  0020
知 77e5
乎 4e4e
日 65e5
报 62a5
每一个字符对应一个十六进制数字。

计算机只懂二进制,因此,严格按照unicode的方式(UCS-2),应该这样存储:
I 00000000 01001001
t 00000000 01110100
‘ 00000000 00100111
s 00000000 01110011
  00000000 00100000
知 01110111 11100101
乎 01001110 01001110
日 01100101 11100101
报 01100010 10100101
这个字符串总共占用了18个字节,但是对比中英文的二进制码,可以发现,英文前9位都是0!浪费啊,浪费硬盘,浪费流量。

怎么办?

UTF。

UTF-8是这样做的:

1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;

2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。

这样就形成了如下的UTF-8标记位:

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
... ...

于是,”It‘s 知乎日报“就变成了:
I 01001001
t 01110100
‘ 00100111
s 01110011
  00100000
知 11100111 10011111 10100101
乎 11100100 10111001 10001110
日 11100110 10010111 10100101
报 11100110 10001010 10100101
和上边的方案对比一下,英文短了,每个中文字符却多用了一个字节。但是整个字符串只用了17个字节,比上边的18个短了一点点。
 
---------------------
作者:Deft_MKJing宓珂璟
原文:https://blog.csdn.net/Deft_MKJing/article/details/79460485 详情见
 
注意:
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节
Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。平时所说的unicode编码是 UCS-2。
 
1)ANSI:文件的编码就是两个字节D1 CF,这正是严的 GB2312 编码,这也暗示 GB2312 是采用大头方式存储的。

2)Unicode:编码是四个字节FF FE 25 4E,其中FF FE表明是小头方式存储,真正的编码是4E25。

3)Unicode big endian:编码是四个字节FE FF 4E 25,其中FE FF表明是大头方式存储。
 
4)UTF-8:编码是六个字节EF BB BF E4 B8 A5,前三个字节EF BB BF表示这是UTF-8编码,后三个E4B8A5就是严的具体编码,它的存储顺序与编码顺序是一致的。














































以上是关于unicode的主要内容,如果未能解决你的问题,请参考以下文章

C#学习笔记——需要注意的基础知识

片段是否执行基础数据的复制?

Unicode 代码点转义语法

如何将 Unicode 字符转换为十六进制格式的 Unicode 代码点?

在 C++ 源代码中使用 Unicode

Unicode 是不是有定义的最大代码点数?