当前位置: 首页 编码 UTF-8编码解码
NCR-10
NCR-16
编码介绍

Unicode: (Universal Code 统一码)是一个囊括了世界上所有字符的字符集,其中每一个字符都对应有唯一的编码值(code point),然而它并不是一种什么编码格式,仅仅是字符集而已。Unicode 字符不管具体怎么编码和存储。  UTF-8、UTF-16、UTF-16是Unicode的实现

  • UTF-8: (Unicode Transformation Format)就是在互联网上使用最广的一种Unicode的实现方式(怎么编码,怎么存储)。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32 (字符用四个字节表示)
  • UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度
  • UTF-8常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4个字节.如果要传输的文本包含大量英文字符,用UTF-8编码就能节省空间

UTF-8编码规则如下:

  • 对于U+0000 到 U+007F(ASCII字符),用一个字节编码。
  • 对于U+0080 到 U+07FF,用两个字节编码。
  • 对于U+0800 到 U+FFFF,用三个字节编码。
  • 对于U+10000 到 U+10FFFF,用四个字节编码。

编码实现

概括的说:对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。

  1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
  2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

1字节 0xxxxxxx 
2字节 110xxxxx 10xxxxxx 
3字节 1110xxxx 10xxxxxx 10xxxxxx 
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 ~ 007F | 0xxxxxxx
0080 ~ 07FF | 110xxxxx 10xxxxxx
0800 ~ FFFF | 1110xxxx 10xxxxxx 10xxxxxx
1 0000 ~1F FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

BOM

BOM:在一个文本文件或者一段字符编码前加上几个固定的字节用于识别,这些字节保证不对应任何一个字符,所以软件一读就能验明正身:

  • EF BB BF - UTF-8
  • FF FE - UTF-16LE(Little endian)
  • FE FF - UTF-16BE(Big endian)

以汉字「中」为例,Unicode码是4e2d,需要用两个字节存储,一个字节是4e,另一个字节是2d。存储的时候,4e在前,2d在后,就是Big endian(高位字节在前,阅读顺序)方式;2d在前,4e在后,就是Little endian(低位字节在前)方式。Windows的记事本还有Windows其它地方所谓的Unicode编码,其实是UTF-16LE