其他分享
首页 > 其他分享> > UTF8与UTF16/32、Unicode、GB2312的故事

UTF8与UTF16/32、Unicode、GB2312的故事

作者:互联网

文字不能直接存储在计算机中,因为计算机只认识0和1,这时候A国和B国都想到了用字典去一一对应。比如A国认为‘我’=0,‘好’=1,‘帅’=10,那么计算机中存储的应该是00000000,00000001,00000010。而B国认为‘帅’=0,‘个’=1,‘鬼’=10,那么计算机中同样的东西,A国的“我好帅”在B国就变成了“帅个鬼”。可见,一个输入要用相同的字典去读取才能看到同样的结果。

上面的字典可以看作文本的编码方式,也可以看作字符集;而A国的“我好帅”到B国变成“帅个鬼”就是我们常常遇到的乱码现象。从文字转换成计算机中的000...1就是文字的编码,而从000...1又转换成文字的过程就叫解码

那么,只有编码过程和解码过程使用同一种字符集,输入和输出才会是一样的!否则就是乱码

常见的编码方式有以下几种:

Ascii码、gb2312、utf8、utf16、utf32、Unicode等。

# 中间预留一波

utf16和utf32都是固定长度的,utf16固定16位,即2字节,可以表示最多216=65536个字符;utf32固定32位,即4字节,可以表示最多232约43亿个字符。

优点:获取第n位时,直接取出,不需要计算长度,因为总长度已知。

缺点:不方便跨平台,因为有些平台是大端字节序,有些平台是小端字节序,这些平台之间通信就需要转换字节序,是比较耗时的。用来存储西方的文字时,由于西方的文字比较少,一般1字节就可以,固定使用这些太浪费空间了!

 

utf8是变长的字符集!目前可以表示1~4字节的长度。那么肯定需要有规则能区分它的长度,不然就乱了。

规则:

0xxx xxxx表示1字节的长度,最多可以表示27=128个字符

110x xxxx 10xx xxxx 表示2字节的长度,最多可以表示211=2048个字符

1110 xxxx 10xx xxxx 10xx xxxx表示3字节长度,最多可以表示216=65536个字符

优点:可以无视字节序变化,不会导致乱码;对于欧洲的文字,可以避免严重的浪费空间;

缺点:长度可变,不能随时存取第n位数据,只能从最开始往后得出每一个序列。

 

一般,把文本加载到内存中用utf16和utf32,而跨平台存储与传输则使用utf8更适合

# 时间有限,to be continue...

标签:文字,xxxx,字节,UTF8,GB2312,utf32,Unicode,长度,utf16
来源: https://www.cnblogs.com/strong-monkey/p/16444934.html