[十]基础数据类型之Unicode编码简介
编码含义
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 最直观的例子就是网络中报文的传输,都会附加自己的头信息 |
|
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个二进制位的话 所以Unicode标准规定:基本多语言平面内,U+D800..U+DFFF的值不对应于任何字符,为代理区 ,其中又分为高代理区和低代理区 U+D800 加上10个二进制位的数值的最大值,可以得到高代理区的范围 下一个就是0xDBFF +1 = 0xDC00,所以低代理区从0xDC00 开始 |
| 高代理区范围 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
|
[十]基础数据类型之Unicode编码简介的更多相关文章
- Java基础-二进制以及字符编码简介
Java基础-二进制以及字符编码简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机毕业的小伙伴或是从事IT的技术人员都知道数据存储都是以二进制的数字存储到硬盘的.从事开 ...
- 【C# 基础概念】Unicode编码详解
Unicode定义:Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字 ...
- python基础数据类型补充以及编码的进阶
一.基本数据类型的补充循环列表改变列表大小的问题#请把列表中索引为基数的元素写出l1=[1,2,3,4,5,6]for i in l1: if i%2!=0: print(i)结果:135二:基本数据 ...
- 基础数据类型之AbstractStringBuilder
String内部是一个private final char value[]; 也就意味着每次调用的各种处理方法,返回的字符串都是一个新的,性能上,显然.... 所以,对于可变字符序列的需求是很明确的 ...
- Python基础编程:字符编码、数据类型、列表
目录: python简介 字符编码介绍 数据类型 一.Python简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心 ...
- Unicode/UTF-8/GBK/ASCII 编码简介
转载:http://blog.csdn.net/u014785687/article/details/73928167 一.字符编码简介 1.ASCII编码 每一个ASCII码与一个8位(bit)二进 ...
- day02_20190106 基础数据类型 编码 运算符
一.格式化输出 name = input('请输入姓名') age = input('请输入年龄') hobby = input('请输入爱好') job = input('请输入你的工作') # m ...
- 记录我的 python 学习历程-Day07 基础数据类型进阶 / 数据类型之间的转换 / 基础数据类型总结 / 编码的进阶
基础数据类型 str(字符串) str:补充方法练习一遍就行 s.capitalize() 首字母大写,其余变小写 s = 'dyLAn' print(s.capitalize()) # Dylan ...
- python27期day07:基础数据类型补充、循环删除的坑、二次编码、作业题。
1.求最大位数bit_length: a = 10 #8421 1010print(a.bit_length())结果:42.capitalize首字母变大写: s = "alex" ...
随机推荐
- Egret的容器--删除对象,遮罩
class P91F extends egret.Sprite { public constructor() { super(); this.addEventListener(egret.Event. ...
- 打包java程序生成exe
打包java程序生成exe 目标 我们知道c++的控制台程序编译运行以后就会生成一个exe可执行文件,在电脑上可以直接双击运行,但是java是跨平台的语言,编译运行以后的字节码文件.class是和平台 ...
- xlrd模块
import xlrdbook = xlrd.open_workbook('app_student.xls')sheet = book.sheet_by_index(0)# sheet2 = book ...
- IaaS,PaaS和SaaS
云计算的三种服务模式:IaaS,PaaS和SaaS IaaS: Infrastructure-as-a-Service(基础设施即服务)是第一层. PaaS: Platform-as-a-Servic ...
- node03
1.express处理post请求 借助body-parse中间件,其实最终我们也不会使用这个 对于get请求,无需中间件,用req.query即可返回相应的数据 但是post我们尝试借助中间件处理 ...
- zstd --压缩工具
Zstandard (也被称为zstd )是一款免费的开源,快速实时数据压缩程序,具有更好的压缩比 (约为 10:1). 安装 yum group install "Development ...
- 你不知道的JS之 this 和对象原型(一)this 是什么
原文:你不知道的js系列 JavaScript 的 this 机制并没有那么复杂 为什么会有 this? 在如何使用 this 之前,我们要搞清楚一个问题,为什么要使用 this. 下面的代码尝试去 ...
- vue 登录跳转
前几次做登录处理,都是写一个公用方法,然后在对应的路由页面调用,即判断是不是处于登录状态,如果不是,就返回登录页面. let exit = (vm)=>{ let login = session ...
- 使用datagrip链接mysql数据库的报错问题.
1. datagrip刚打开时候,选择风格是白是黑后, 会有一个选择什么数据库,有oracle...一大堆,别选错了.我的是mysql,不要选成了windows sql 和sql. 2 基本设置写完, ...
- JDK的下载,安装,环境变量配置
JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 环境变量配置:在"系统变量" ...
