[十]基础数据类型之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" ...
随机推荐
- Unity-修改Debug日志文本颜色
Unity开发过程中Debug信息是非常重要的,但是千篇一律的白色字符不能迅速找出想要的信息,添加些字体颜色是个很好的办法,比如: AppDebug.Log("<color=#ff84 ...
- IndentityServer4
官网: https://identityserver4.readthedocs.io/en/latest/index.html 比较好的中文博客: 晓晨Master: https://www.cnbl ...
- 转 c#性能优化秘密
原文:http://www.dotnetperls.com/optimization Generally, using the simplest features of the language pr ...
- Gradle 学习一
参考教程:https://guides.gradle.org/consuming-jvm-libraries/ 安装Gradle 下载地址:https://guides.gradle.org 配置环境 ...
- nova vnc proxy基本原理
先上图 VNC Proxy的功能: 将公网(public network)和私网(private network)隔离 VNC client运行在公网上,VNCServer运行在私网上,VNC Pro ...
- 【转载】C++ ,C#数据类型对照
C++ C#=====================================WORD ushortDWORD uintUCH ...
- 【安富莱二代示波器教程】第18章 附件C---波形拟合
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=45785 第18章 附件C---波形拟合 emWin5. ...
- 高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?
基本的IO编程过程(包括网络IO和文件IO)是,打开文件描述符(windows是handler,java是stream或channel),多路捕获(Multiplexe,即select和poll和ep ...
- [Swift]LeetCode257. 二叉树的所有路径 | Binary Tree Paths
Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...
- zuul网关入门(一、网关具有的功能)
1. zuul网关入门(一.网关具有的功能) 1.1. 基本场景 1.1.1. API网关的由来 1.1.2. API网关基本功能 1.2. 高级应用 1.2.1. 亮点 可动态发布的过滤器机制 1. ...
