编程基础字符篇(3)



UTF8是一种储存和传送的格式。



UTF8是以8bits1Bytes为编码的最基本单位,也可以基于16bits32bits的形式,分别称为UTF16UTF32,但目前使用不多,而UTF8则被广泛应用在文件储存和网络传输中。





编码原理



先看这个模板:



UCS-4 range (hex.) UTF-8
octet sequence (binary)

0000 0000-0000 007F 0xxxxxxx

0000 0080-0000 07FF 110xxxxx 10xxxxxx

0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx



0001 0000-001F FFFF 11110xxx
10xxxxxx 10xxxxxx 10xxxxxx

0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx



编码步骤:

1)
首先确定需要多少个8bits(octets)

2)
按照上述模板填充每个octets的高位bits

3)
把字符的bits填充至x中,字符顺序:低位高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x

4)
解码的原理一样。



实例:(留意每个bit的颜色,粗体字为模板内容)



UCS-4 UTF-8

HEX BIN Bytes BIN HEX Bytes

0000 000A 00001010 4 00001010 0A 1

0000 0099 10011001 4 11000010 10011001 C2 99 2

0000 8D99 10001101 10011001 4 11101000 10110110 10011001 E8 B6 99 3



UTF8格式储存的文件档首标识为EF
BB BF





效率



从上述编码原理中得可以得以下结论:

1.
每个英文字母、数字所占用空间为1 Byte

2.
汉字占3
Bytes


而直接使用无论是ANSI还是Unicode/UCS2来编码,中文都只占用2字节。所以UTF8对英文来说是个非常好的方案,但对中文来说并不是一个好的选择。



也就是说,英文编码一般用UTF8,中文使用的是GB18030



Unicode:

unicode.org
制定的编码机制, 要将全世界常用文字都函括进去.

1.0中是16位编码,
U+0000U+FFFF.
每个2byte码对应一个字符;
2.0开始抛弃了16位限制,
原来的16位作为基本位平面,
另外增加了16个位平面,
相当于20位编码,
编码范围00x10FFFF.



UCS:

ISO
制定的ISO10646标准所定义的
Universal Character Set,
采用4byte编码.



Unicode
UCS的关系:

ISO
unicode.org是两个不同的组织,
因此最初制定了不同的标准; 但自从unicode2.0开始,
unicode
采用了与ISO 10646-1相同的字库和字码,
ISO
也承诺ISO10646将不会给超出0x10FFFFUCS-4编码赋值,
使得两者保持一致.



UCS
的编码方式:

UCS-2,
unicode2byte编码基本一样.

UCS-4, 4byte
编码, 目前是在UCS-2前加上2个全零的byte.



UTF:
Unicode/UCS Transformation Format

UTF-8, 8bit
编码, ASCII不作变换,
其他字符做变长编码, 每个字符1-3 byte. 通常作为外码.
有以下优点:

*
CPU字节顺序无关,
可以在不同平台之间交流

*
容错能力高,
任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(GB码错一个字节就会整行乱码)

UTF-16, 16bit
编码, 是变长码,
大致相当于20位编码,
值在00x10FFFF之间,
基本上就是unicode编码的实现.
它是变长码,
CPU字序有关,
但因为最省空间,
常作为网络传输的外码.

UTF-16
unicodepreferred
encoding.

UTF-32,
仅使用了unicode范围(00x10FFFF)32位编码,
相当于UCS-4的子集.



UTF
unicode的关系:

Unicode
是一个字符集, 可以看作为内码.

UTF是一种编码方式,
它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码,
没有变换,
但它包含了0x00在编码内,
256字节码的第一个byte都是0x00,
在操作系统(C语言)中有特殊意义,
会引起问题.
采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.



中国国标编码:

GB 13000:
完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO
10646/Unicode
的标准更改而同步更改.

GBK:
GB2312的扩充,
以容纳GB2312字符集范围以外的Unicode
2.1
的统一汉字部分, 并且增加了部分unicode中没有的字符.

GB 18030-2000:
基于GB 13000, 作为Unicode
3.0
GBK扩展版本,
覆盖了所有unicode编码,
地位等同于UTF-8,
UTF-16,
是一种unicode编码形式.
变长编码,
用单字节/双字节/4字节对字符编码.
GB18030
向下兼容GB2312/GBK.

GB 18030
是中国所有非手持/嵌入式计算机系统的强制实施标准.



做个快乐的自己。
原文地址:https://www.cnblogs.com/Jessy/p/2248039.html