unicode、utf8、utf16关系

  • 关系

第一步:Unicode是用0至65535之间的数字来表示所有字符.其中0至127这128个数字表示的字符仍然跟ASCII完全一样.65536是2的16次方
第二步:解决怎么把0至65535这些数字转化成01串保存到计算机中.这肯定就有不同的保存方式了.于是出现了UTF(unicode transformation format),有UTF-8,UTF-16。需要说明的是,这里不是简单地把Unicode编号转换为二进制,因为要处理多个字节连在一起的情况。比如 邹(001)恒(011),因为汉字非常多,则一定还有一个汉字编码为(001011),此时如果单纯按照二进制保存就无法分辨是一个字符还是两个字符了

  • 理解

假如中文字"汉"对应的unicode是6C49(这是用十六进制表示,用十进制表示是27721。二进制为 110110001001001,可以将utf8理解为一段加密和解密的函数,utf8负责将这个二进制转换为另外一种二进制存储在磁盘中,解码时再使用utf8将磁盘中的数据转换为unicode对应的二进制,对照unicode表就能找到对应的真实字符。
与unicode处于平等地位的还有gb2312,所以,如果要将gb2312转换为utf8,则需要先转换为unicode
你可能会问当用程序打开一个文件时我们怎么知道那是用的UTF-8还是UTF-16啊.自然会有点啥标志,在文件的开头几个字节就是标志.(注:UTF-8中的8并不表示只有8个字节,utf8是可变长度,可能为一个、两个、三个或更多字节)

EF BB BF 表示UTF-8

FE FF 表示UTF-16.

  1. 用UTF-16表示"汉"

假如用UTF-16表示的话就是01101100 01001001(共16 bit,两个字节).程序解析的时候知道是UTF-16就把两个字节当成一个单元来解析.这个很简单.

  1. 用UTF-8表示"汉"

用UTF-8就有复杂点.因为此时程序是把一个字节一个字节的来读取,然后再根据字节中开头的bit标志来识别是该把1个还是两个或三个字节做为一个单元来处理.

0xxxxxxx,如果是这样的01串,也就是以0开头后面是啥就不用管了XX代表任意bit.就表示把一个字节做为一个单元.就跟ASCII完全一样.

110xxxxx 10xxxxxx.如果是这样的格式,则把两个字节当一个单元

1110xxxx 10xxxxxx 10xxxxxx 如果是这种格式则是三个字节当一个单元.

  • GBK扩充了GB2312,且对其兼容
  • GB2312 字符集是 Unicode 字符集的一个子集。这也就是说,GB2312 所收录的每一个字符都收录在 Unicode 之中。但是 GB2312 编码和 Unicode 编码确没有什么相同之处。同一个汉字,它的 GB2312 编码和 Unicode 编码确毫不相同。例如:汉字“啊”,它的 GB2312 编码为 0xB0A1,但是它的Unicode 编码为 0x554A。

Leave a Comment