unicode和utf8编码

Asura 2018年03月27日 107次浏览

兼容问题

由于ASCII存在字符含量过少的缺陷,所以不但我国自己搞出了国际码。其他国家也都设计出了符合自己国情的字符集

但是这就带来了问题

各个字符集之间不兼容怎么办?

Unicode

Unicode 4个字节32位

真正有效范围: 0x0 – 0x 10ffff
约十进制:1114112 个字符

unicode相当于 “区位码”(也就是电脑中运行的),实际存储要按照相应的编码方案

字符集 编码方案
UTF-8
UTF-16

UTF-8的存储

UNICODE编码(16进制)UTF8字节流(二进制)
000000 – 00007F0xxxxxx
000080 – 0007FF110xxxxx 10xxxxxx
000800 – 00FFFF1110xxxx 10xxxxxx 10xxxxxx
090000 – 10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

例子:

比如 “啊” => UNICODE = 554A

0x00554A 处于区间 000800 - 00FFFF

所以格式为: 1110xxxx  10xxxxxx 10xxxxxx

0x554a 二进制为 : 0101 0101 0100 1010

所以实际存储的内容为:
格式:
1110xxxx  10xxxxxx 10xxxxxx
填充:
11100101 10010101 10001010
实际则为:
E5958A

UTF-16的存储

unicode 范围: 0x00000000 – 0x0010FFFF

uft-16

多语言字符区
0x00000000 – 0x0000ffff => 占两个字节

辅助平面区
0x00100000 – 0x0010FFFF => 占四个字节

以16位2字节进行对齐

总的来说存储比较复杂。。。