本文总结自:https://blog.csdn.net/zmx729618/article/details/51821024
1. ISO 8859-1
字节数:1
范围:0-255(编码范围是0x00-0xFF),其中0x00-0x7F之间完全和ASCII一致(ASCII是7位编码,能个表示128个字符),因此向下兼容ASCII
表达范围:多用于英文系列,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。。。无法表示中文字符。
备注:由于ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO 8859-1的系统中,传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题(可以用它表示其他编码)。
这是个很重要的特性,所以很多情况下(如很多协议传输数据时)都使用ISO 8859-1编码。
2. GB2312/BIG5/GBK
GB2312
范围:ISO 8859-1的范围+简体中文
字节数:表达汉字时2个字节,表达英文1个字节,与ISO 8859-1一致,属于变长编码系统
BIG5
表达繁体汉字,多与GB2312结合使用
GBK
为解决GB2312与BIG5不兼容问题而诞生
范围:ISO 8859-1的范围+ 所有亚洲文字的双字节字符,包括简体中文,繁体中文,日语,韩语等
字节数:类似于GB2312,属于变长编码系统
3. Unicode
范围:所有语言
字节数:2个字节,包括英文字母在内,都以双字节表示,所以它是不兼容ISO 8859-1编码的。对于ISO 8859-1中所编码的字符,Unicode编码只是在前面增加了一个全为0字节
4. UTF/UTF-8/UTF-16/UTF-32
UTF
Unicode编码不兼容ISO 8859-1编码,而且容易占用更多的空间:因为对于英文字母,Unicode也需要两个字节来表示,所以Unicode不便于传输和存储。因此而产生了UTF编码。
UTF是(Unicode Translation Format),即Unicode用于传输的格式。
UTF-32
字节数:4
Linux操作系统上所使用的Unicode方案,也是一种定长编码。其缺点很显然是造成了空间的巨大浪费,从而非常没有效率,因此没有UTF-8和UTF-16使用的频繁,不做赘述。
UTF-16
字节数:2
但是,上文已经提到,Unicode基本多语言平面的字符只使用2个字节就可以表示了,真正需要扩展到4个字节来表示的字符少之又少。所以使用2个字节来表示Unicode代码是一种很自然的选择,例如英文的Unicode范围是0x0000-0x007F,中文的Unicode范围是0x4E00-0x9F**。对于那些扩展平面中需要4个字节才能表示的字符,UTF-16使用一种代理的手法来扩展(使用了基本多语言平面保留的0xD800-0xDFFF区段,表示这是一个代理,从而用2个16位码元组成一个字符)。这样的好处是大量的节约了存取空间,也提高了处理的速度。这种Unicode表示方法就是UTF-16,显然,UTF-16需要1个或者2个16位长的码元来表示,因此这是一个变长表示。一般在Windows平台上,提到Unicode,那就是指UTF-16了。
UTF-16有一个著名的Endian的问题,即UTF16-LE和UTF16-BE,LE指Little Endian,而BE指Big Endian。关于这方面的信息,网上有很多相关的帖子。这与计算机的CPU架构有一定关系,我们一般的X86系统都是Little Endian的,可以认为UTF16就是UTF16-LE。
另外,UTF有一个BOM(Byte Order Mark)的问题。在Unicode编码中有一个叫做"zero-width no-break space (ZWNBSP)"的字符,它的编码是0xFEFF。而0xFEFF在是一个实际中不存在的字符,所以不应该出现在实际传输中。UCSUCS (Unicode Character Set) 规范建议我们在传输字节流前,先传输字符"ZWNBSP"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符"ZWNBSP"又被称作BOM。
UTF-8
字节数:1-6个不等,例如中文,3个字节,英文,1个字节,兼容ISO 8859-1
UTF16的最大好处在于大部分字符都以固定长度的字节(2字节)储存,但UTF-16却无法兼容于ASCII编码。由于对于欧洲和北美,实际上使用的编码范围在0x0000-0x00FF之间,只需要一个字符就可以表示所有的字符。即使是使用UTF16来作为内存的存取方式,还是会带来巨大的空间浪费,因此就有了UTF8的编码方式。
UTF-8编码是最灵活的UTF编码形式,即兼容ISO 8859-1的编码,同时也可以用来表示所有语言的字符。显然,UTF-8编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,UTF编码自带简单的校验功能。
备注:
理论上将,UTF-8 格式使用1-6字节,最大能编码 31 位字符,但最新的 UTF-8规范也只使用1-4个字节,最大能编码21位。
不同平台对UTF-8的支持不相同,例如低版本的低版本的MySQL只支持到3字节。
UTF8mb4
utf8mb4比utf8多了对emoji编码支持。