[十]基础数据类型之Unicode编码简介
2018-10-11 10:01:59来源:博客园 阅读 ()
编码含义
Unicode诞生
Unicode不够用了
00 01 02 03 04 05 06 07 08 0A 0B 0C 0D 0E 0F 10 |
于是按照扩展位,划分了17个维度,这每个维度,叫做一个平面
17个平面,编号从 0~16
|
每个平面 65536个字符 |
17个平面,扩展后总共可以表示1114112个字符 |
扩展后的范围为
U+000000 ~ U+10FFFF
|
编码方式
听起来可能有点迷惑,不是知道具体的值了么?怎么还不知道如何表示? 比如数字1 他的码点是1 假如我用两个字节来存储,每个字节的前两位我当做其他的标志位, 设置为11 那么可能结果是这样子的11000000 11000001 显然,他的值并不是1 编码方式只是可以保证,你的字符是按照指定的字符集进行编码的 也就是说如果你告诉我拿出来码点为1 的,我会把1100 0000 1100 0001 解析成数字1 但是并不能保证我保存的数据就是他的码点的真值,0000 0001 ,中间形式是编码方式说了算的 最直观的例子就是网络中报文的传输,都会附加自己的头信息 所以中间传输的数据并不是跟你发送的数据一模一样,中间的数据就是编码形式的存储 但是,接收端接受解析后,就是跟你发送的数据一样的,这就好像是你的字符 |
UTF-8 是变长
UTF-32 是定长
UTF-16介于他们之间 2个字节或者4个字节
|
utf-16
UTF-16编码以16位无符号整数为单位 |
我们把Unicode编码记作U 编码规则如下
如果U<0x010000, 也就是0x000000 ~ 0x00FFFF
U的UTF-16编码, 就是U对应的16位无符号整数
|
如果U≥0x010000 也就是0x010000 ~ 0x10FFFF 我们先计算下 U'=U-0x010000 可以得出来 U' 范围是 0x000000 ~ 0x0FFFFF 显然, U'的最大值为0xFFFFF 也就是最多20个1 也就是可以被写成20个二进制位 既然是20个二进制位,那么我们是不是可以把它拆分成两组呢? 每组10个二进制位 00 0000 0000 它能表示的范围是2的10次方=1024个 BMP是2个字节,16位, 很显然,如果把U' 拆分成两组,每组10个二进制位的话 每一个都能够保存到2个字节内 所以Unicode标准规定:基本多语言平面内,U+D800..U+DFFF的值不对应于任何字符,为代理区 ,其中又分为高代理区和低代理区 U+D800 加上10个二进制位的数值的最大值,可以得到高代理区的范围 U+D800 --->1101 10 00 0000 0000 + 0000 00 11 1111 1111 = 1101 1011 1111 1111 = 0xDBFF 下一个就是0xDBFF +1 = 0xDC00,所以低代理区从0xDC00 开始 0xDC00 加上10个二进制位的数值的最大值,可以得到低代理区的范围 0xDC00----> 1101 1100 0000 0000 + 0000 00 11 1111 1111 = 1101111111111111 = 0xDFFF |
高代理区范围 U+D800 ~0xDBFF 低代理区范围 0xDC00 ~ 0xDFFF 代理区间是U+D800....U+DFFF |
所以UTF-16的编码方式就是 先计算 U'=U-0x010000 然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx 然后分别计算高位代理和低位代理 U+D800 --->1101 10 00 0000 0000 + 0000 00 yy yyyy yyyy = 1101 10 yy yyyy yyyy 0xDC00----> 1101 1100 0000 0000 + 0000 00 xx xxxx xxxx = 1101 11xx xxxx xxxx |
再精简下步骤 1. 先计算 U'=U-0x010000 2. 然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx 3.两个值为 1101 10 yy yyyy yyyy / 1101 11xx xxxx xxxx |
之前我们提到过,Unicode中的一个字符的值,被称之为一个码点
显然,一个码点,可能被一个代码单元存储,也可能被两个连续的代码单元存储
|
UTF-32
UTF-8
规则 可以把编码分解成两部分,head和body head中记录需要字节的个数,使用第一个字节中1 的个数来表示 body记录真实的数据, 如果需要不止一个字节,那么body自然由多个字节组成,每个body的前两个字节为10 其余为数据 UTF-8编码的最大长度是4个字节,也就是最多有21个x 表示 Unicode的最大码位0x10FFFF 0001 0000 1111 1111 1111 1111也只有21位 |
如果一个字节足够表示 只需要一个字节即可表示,那么第一位为0 其余7位用于表示字符编码的值 看得出来明显的好处,可以兼容ASCII |
如果一个字节不够表示,根据范围选择,需要几个字节,就有几个1,然后补一个0 后面的body依次存放数据即可 |
想要确定一个码点的编码 1. 查看范围,根据上表确定格式 2.转换为对应的二进制序列 3. 替换掉x即可 |
字节序
在内存中0x01020304的存储方式
内存地址 4000 4001 4002 4003
BE 01 02 03 04
LE 04 03 02 01
|
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 04.Java基础语法 2020-06-11
- Flink 如何分流数据 2020-06-11
- 数据源管理 | Kafka集群环境搭建,消息存储机制详解 2020-06-11
- 1-Java基础回顾整理_01 2020-06-10
- Java基础语法菜鸟教程笔记 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash