unicode和utf-8是啥关系

Posted

tags:

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

说的是属于父子关系还是同一个东西?

举一个例子: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个短了一点点。
参考技术A unicode是一种定义,它定义了每个字符对应的code
point,也就是码点,或者说对应的数字。
实际存储有unicode16,unicode
32,UTF-7,UTF-8等等编码形式的。
他们都是unicode定义的一种变形~~~有规律的变形形式,所以可以转换。
为什么变形?是为了满足一些实际需要。
比如为什么有UTF-8?因为unicode定义里每个字符都占用两个字节,
而英数字其实一个字节就够了,另外一个字节是白白浪费的。
所以,变形出了UTF-8编码形式。英数字还用一个字节,汉字用3个字节~~
有个转换对应表,看下就明白了。
参考技术B unicode 是一种编码表格,例如,给一个汉字规定一个代码。类似 GB2312-1980, GB18030等,只不过字集不同。

一个unicode码可能转成长度为一个BYTE,或两个,三个,四个BYTE的UTF8码,取决于unicode码的值。英文unicode码因为值小于0x80,只要用一个BYTE的UTF8传送,比送unicode两个BYTEs快。
UTF8是为传送unicode而想出来的“再编码”方法罢了。
UTF8转unicode用我上面给的程序反算即可。

参考资料:百度

本回答被提问者和网友采纳
参考技术C

彻底搞定各种编码ASCII、ANSI、GBK、utf

Unicode 与 utf8 utf16 utf32的关系

Unicode是计算机领域的一项行业标准,它对世界上绝大部分的文字的进行整理和统一编码,Unicode的编码空间可以划分为17个平面(plane),每个平面包含2的16次方(65536)个码位。17个平面的码位可表示为从U+0000到U+10FFFF,共计1114112个码位,第一个平面称为基本多语言平面(Basic Multilingual Plane, BMP),或称第零平面(Plane 0)。其他平面称为辅助平面(Supplementary Planes)。基本多语言平面内,从U+D800到U+DFFF之间的码位区段是永久保留不映射到Unicode字符,所以有效码位为1112064个。

Unicode的编码方式

unicode 只是一种字符码表, 而在计算机中进行存储时, 必须指定一种具体的存储方式。常见的如utf8, utf16, utf32

比如,对于英文字符A , 在unicode中的值是65, 其在计算机中存储时, 使用utf8 utf16 utf32等不同格式存储时, 是完全不同的。

utf8存储,在内存中就是0x41;  utf16存储,在内存中就是0x0041 ; utf32存储,在内存中就是0x00000041

在windows编程中, 字符格式通常有多字节(ansic)与宽字符(unicode)之分。 很多时候,我们认为unicode就是用两个字符来表示英文字母, 其实这是不准确的。 因为windows中,默认的unicode编码方式就是utf16, 所以英文字符才是两个字节。

 

UTF-8(8-bit Unicode Transformation Format)

UTF-8是一种变长编码,对于一个Unicode的字符被编码成1至4个字节。Unicode编码与UTF-8的编码的对应关系:

Unicode编码UTF-8编码(二进制)
U+0000 – U+007F 0xxxxxxx
U+0080 – U+07FF 110xxxxx 10xxxxxx
U+0800 – U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

一个字节的uft8表示的unicode 码范围为(0 ~0x7F)

两个字节长度的uft8 表示的unicode码范围为(0x80 ~ 0x07FF)

三个字节长度的uft8 表示的unicode码范围为(0x0800 ~ 0xFFFF)

四个字节长度的uft8 表示的unicode码范围为( 0x10000 ~ 0x10FFFF)

 

其中绝大部分的中文用三个字节编码,部分中文用四个字节编码,举例如下:

Unicode字符UTF-8编码
U+0041 A 0x41
U+7834 0xE7 0xA0 0xB4
U+6653 0xE6 0x99 0x93
U+2A6A5 ??(四个龍) 0xF0 0xAA 0x9A 0xA5

UTF-16(16-bit Unicode Transformation Format)

UTF-16也是一种变长编码,对于一个Unicode字符被编码成1至2个码元,每个码元为16位。

基本多语言平面(码位范围U+0000-U+FFFF)

在基本多语言平面内的码位UTF-16编码使用1个码元且其值与Unicode是相等的(不需要转换)。举例如下

Unicode字符UTF-16(码元)UTF-16 LE(字节)UTF-16 BE(字节)
U+0041 A 0x0041 0x41 0x00 0x00 0x41
U+7834 0x7834 0x34 0x78 0x78 0x34
U+6653 0x6653 0x53 0x66 0x66 0x53

辅助平面(码位范围U+10000-U+10FFFF)

在辅助平面内的码位在UTF-16中被编码为一对16bit的码元(即32bit,4字节),称作代理对(surrogate pair)。组成代理对的两个码元前一个称为前导代理(lead surrogates)范围为0xD800-0xDBFF,后一个称为后尾代理(trail surrogates)范围为0xDC00-0xDFFF。

具体的转换过程为

1 首先将unicode码表 - 0x10000 , 这样得到的辅助平面的码表范围为(U+0000 - U+FFFFF) ,总共最多20bit

2  将20bit ,分为high 10bit 与 low 10bit。 high 1bit | 0xD800 得到前导代理, low 10bit | 0xDC00 得到后尾代理

从这里也可以理解为什么 在基本多语言平面中, (U+D800  ~ U+DFFF ) 要作为保留字符了

 

举例如下

 

Unicode字符UTF-16(码元)UTF-16 LE(字节)UTF-16 BE(字节)
U+2A6A5 ?? 0xD869 0xDEA5 0x69 0xD8 0xA5 0xDE 0xD8 0x69 0xDE 0xA5

UTF-32(32-bit Unicode Transformation Format)

UTF-32是一种定长编码,使用1个32bit的码元,其值与Unicode编码值相等。举例如下:

 

Unicode字符UTF-32(码元)UTF-32 LE(字节)UTF-32 BE(字节)
U+0041 A 0x00000041 0x41 0x00 0x00 0x00 0x00 0x00 0x00 0x41
U+7834 0x00007834 0x34 0x78 0x00 0x00 0x00 0x00 0x78 0x34
U+6653 0x00006653 0x53 0x66 0x00 0x00 0x00 0x00 0x66 0x53
U+2A6A5 ?? 0x0002A6A5 0xA5 0xA6 0x02 0x00 0x00 0x02 0xA6 0xA5

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

unicode16与unicode32之间是啥转换关系

Unicode 和 UTF-8关系

Unicode和UTF-8之间的关系

Unicode和UTF-8的关系

Unicode ASCII UTF-8 GBK关系

Unicode和UTF-8的关系