Unicode标准以及其常见的编码方案
Unicode标准为每一个字符提供一个唯一的数字,而不用区分平台、语言等因素。
The Unicode Standard provides a unique number for every character, no matter what platform, device, application or language.
基本概念
在开始学习之前,我们需要先了解本文所涉及到的一些基本概念。
抽象字符(Abstract character):用于组织、控制或者表示文本数据的信息单元。
- 抽象字符没有具体的形式,不应与图像字符(glyph)混淆。
- 抽象字符不一定对应于人们所认知的“字”,不应与字素(grapheme)混淆。
- 不能被Unicode标准直接编码的抽象字符通常可以通过组合字符序列来表示。
抽象字符序列(Abstract character sequence):一个或多个抽象字符的有序序列。
Unicode编码空间(Unicode codespace):十六进制0x0~0x10FFFF之间的整数。
码位(Code point):Unicode编码空间中的任意值。
编码字符(Coded character):当抽象字符被映射或者分配到编码空间中特定的码位时,它就被称为编码字符。
码位
码位是Unicode标准中很重要的一个概念。它的取值范围是十六进制的0x0~0x10FFFF,换算成十进制是0~1114111,共计1114112个。
需要注意的是,一个单一的抽象字符可能对应一个以上的码位。例如,Ω既可以表示大写的希腊字母Omega,码位是U+03A9,也可以表示物理学中的欧姆符号,码位是U+2126。
>>> '\u03a9'
'Ω'
>>> '\u2126'
'Ω'
单个抽象字符也可以由一系列码位的序列来表示。例如,é的码位是U+00E9,它也可以由小写字母e(码位为U+0065)和 ́(Combining Acute Accent)(码位为U+0301)组合而成。
>>> '\u00e9'
'é'
>>> '\u0065\u0301'
'é'
在Unicode标准中,码位的表示方法通常是使用它们的十六进制,并加上U+前缀。
码位的类型
码位的分类方法多种多样。我们通过下表来阐明Unicode标准使用的七种类型和一些术语。
| 基本类型 | 简要描述 | 是否分配给抽象字符 | 码位范围 |
|---|---|---|---|
| 图形(Graphic) | 字母、标记、数字、标点符号、符号和空格 | 是 | |
| 格式(Format) | 不可见但是影响相邻字符。包括行、段落分割符 | 是 | |
| 控制(Control) | Unicode标准以外的协议或标准定义的用法 | 是 | U+0000~U+001F,U+007F,U+0080~U+009F,共计65个 |
| 私用(Private-use) | Unicode标准以外的私有协议定义的用法 | 是 | |
| 代理 (Surrogate) | 永久预留给UTF-16编码方案 | 不允许分配 | U+D800~U+DFFF,共计2048个 |
| 非字符(Noncharacter) | 永久预留给内部使用 | 否 | U+FDD0~U+FDEF,所有以FFFE或者FFFF结尾的码位,共计66个 |
| 保留(Reserved) | 预留给将来使用 | 否 |
我们需要格外注意代理(Surrogate)类型,理解他有助于我们学习UTF-16。它总共包含2048个码位,码位空间为U+D800~U+DFFF。它由引发出两个新的概念:
高位代理(High-Surrogate):U+D800~U+DBFF范围内的码位,共计1024个。
低位代理(Low-Surrogate):U+DC00~U+DFFF范围内的码位,共计1024个。
关于它们更多的内容,稍后结合UTF-16再讨论。
编码方案
在介绍具体的编码方案之前,我们先明确一些新的基本概念。
Unicode标量值(Unicode scalar value):除去高位代理和低位代理之外,所有的Unicode码位,也就是U+0000~U+D7FF和U+E000~U+10FFFF范围内的码位。
编码单元(Code unit):最小的比特位组合,表示用于交换或处理的编码文本单元。Unicode标准中定义,UTF-8使用8比特的编码单元,UTF-16使用16比特的编码单元,UTF-32使用32比特的编码单元。
编码单元序列(Code unit sequence):一个或多个编码单元的有序序列。
UTF-32
UTF-32将每个Unicode标量值映射成一个无符号的32比特的编码单元,数值与Unicode标量值相同,这是一种定长的编码方案。
注意,UTF-32无法编码U+D800~U+DFFF之间的码位,因为它们不属于Unicode标量值。
>>> '\ud800'.encode('utf32')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'utf-32' codec can't encode character '\ud800' in position 0: surrogates not allowed
UTF-16
UTF-16将Unicode标量值中U+0000~U+D7FF和U+E000~U+FFFF范围内的码位映射成一个无符号的16比特的编码单元,数值与Unicode标量值相同。将U+10000~U+10FFFF范围内的码位映射成一个代理对,所谓的代理对就是上文提到的高位代理和低位代理。UTF-16是一种定长和变长兼顾的编码方案。
下表阐明了UTF-16的编码方式。
| Unicode标量值 | UTF-16 |
|---|---|
| xxxx xxxx xxxx xxxx | xxxx xxxx xxxx xxxx |
| 000u uuuu xxxx xxxx xxxx xxxx | 1101 10ww wwxx xxxx 1101 11xx xxxx xxxx |
其中, wwww = uuuuu - 1
重点分析使用代理对的情况,一个代理对包含一个高位代理编码单元和一个低位代理编码单元,都是16比特的。其中高位代理的范围是U+D800~U+DBFF,转换成二进制,它的格式应该是1101 10xx xxxx xxxx,低位代理的范围是U+DC00~U+DFFF,转换成二进制,它的格式应该是1101 11xx xxxx xxxx。
至此,我们还剩下20位可以填充。我们将码位减去U+10000,再从右到左依次填充进去,就能得到UTF-16的编码。
以字符 Unicode编码方案概述 1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不 ... 转(http://www.codeceo.com/article/java-string-ansi-unicode-bmp-utf.html#0-tsina-1-10971-397232819ff9a ... [梁海的回答(99票)]: 简答.一些细节暂无精力查证,如果说错了还请指出. 一句话建议:涉及兼容性考量时,不要用记事本,用专业的文本编辑器保存为不带 BOM 的UTF-8. * * * 如果是为了跨 ... 参考:Python常见字符编码 + Python常见字符编码间的转换 一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Cod ... 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这 ... 转自http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称 ... ASCII.Unicode.GBK和UTF-8字符编码的区别联系 转载自:http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ... http://dengo.org/archives/901 这是我看过的最好的一篇讲述编码的文章 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到 ... 计算机编码指电脑内部代表字母或数字的方式,常见的编码方式有:ASCII编码,GB2312编码(简体中文),GBK,BIG5编码(繁体中文),ANSI编码,Unicode,UTF-8编码等. 1.ASC ... RPC的由来 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时, ... 在上一篇学习了把参数写进Json文件,然后通过去Json文件,调用参数的方法 1. 三元运算符介绍 调用的方法是通过一个三元运算符实现的 gender = prop.GENDER? prop.GEND ... 此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8680 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,徐丽君 组名:组长 第 ... 一.MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能. MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默认情况下,M ... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 题目大意: 求区间 \([L,R]\) 范围内最长上升子序列(Longest increasin ... 身为一个蒟蒻,由于刷不过[NOI2001]食物链 于是出门左转写了道另一道假的食物链 戳这里 这里的食物链个条数其实就是有向图的路径数(应该是这么说吧,我弱) 思路: 拓扑(Topulogy)(一本正 ... 最近在研究Echarts的相关案例,毕竟现在大数据比较流行,比较了D3.js.superset等相关的图表插件,还是觉得echarts更简单上手些. 本文是以原生JS为基础,如果使用Vue.js的话, ... 前言 主要介绍squire,wangeditor富文本编辑 以及用原生js 如何实现多个关键字标识 需求 如何标记多个关键字,取消关键字 第一种方法 原生 textarea 标记 准备资料参考:张鑫旭 ... 题目描述 查找2-n之间素数的个数.n为用户输入值.素数:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数.如2,3,5,7,11,13,17…. 输入 整数n 输出 2-n ... 招聘和面试对开发经理来说是一个无尽头的工作,虽然有时你可以从HR这边获得一些帮助,但是最后还是得由你来拍板,或者就像另一篇文章“Java 面试题:写一个字符串的反转”所说: 面试开发人员不仅辛苦而且乏 ...
Unicode标准以及其常见的编码方案的更多相关文章
随机推荐