字符编码的那些事儿

首先

编码存储差异

BE(Big Endian):高字节在前,低字节在后
LE(Little Endian):低字节在前,高字节在后
例如,假设从内存地址 0x0000 开始有以下数据:
0x0000 0x0001 0x0002 0x0003
0x12 0x34 0xab 0xcd
如果我们去读取一个地址为 0x0000 的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序为little-endian,则读出结果为0xcdab3412

编码格式检测

到底采用什么编码,如果能检测就好了。
一个叫做BOM(Byte Order Mark)头。意思是字节序标志头。通过它基本能确定编码格式和字节序。
UTF编码 ║ Byte Order Mark   
UTF-8  ║ EF BB BF   
UTF-16LE ║ FF FE   
UTF-16BE ║ FE FF   
UTF-32LE ║ FF FE 00 00   
UTF-32BE ║ 00 00 FE FF
所以通过检测文件前面的BOM头,基本能确定编码格式和字节序。
但是这个BOM头只是建议添加,不是强制的

ASCII

一个字节(8bits):只能显示英文和一些符号
扩展字符集:编号128-255的字符

GBK

GB2312 :对ASCII的中文拓展
GBK:对GB2312的拓展
半角(英文字母、标点等)一个字节,全角两个字节
GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准

Unicode。

Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。

Unicode编码系统可分为编码方式和实现方式两个层次

Unicode defines two mapping methods: the Unicode Transformation Format (UTF) encodings, and the Universal Coded Character Set (UCS) encodings.

编码方式

统一码的编码方式与ISO 10646的通用字符集(Universal Coded Character Set:UCS)概念相对应。目前实际应用的unicode版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。
UCS-4是一个更大的尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。

实现方式

一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。
UTF-8, 可变长编码,一个英文字符等于一个字节,一个中文(含繁体)等于二~四个字节。
维基百科截图
UTF-EBCDIC, an 8-bit variable-width encoding similar to UTF-8, but designed for compatibility with EBCDIC (not part of The Unicode Standard);
UTF-16, 2字节,可变长编码,UTF-16可看成是UCS-2的父集(文本编辑器中的UTF-16选项通常写作"Unicode")
UTF-32, 4字节,定长编码
字节比较

原文地址:https://www.cnblogs.com/jcuan/p/5975786.html