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+D7FFU+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. 谈编码与Unicode标准

    项目过程中,又被编码问题搞得晕头转向.于是决定好好弄明白编码问题. 一.理解编码问题 之所以要编码,是因为计算机只能处理包含0或1的二进制数据.为了电脑能够存储.处理和传输文字,便需要编码来将文字转换 ...

  2. 编码,Part 1:ASCII、汉字及 Unicode 标准

    个人博客 编码的历史由来就懒得介绍了,只需要知道人类处理文本信息是以字符为基本单位,而计算机在最底层只认识 0/1,所以当计算机要为人类存储/呈现字符时,就需要有一个规则,在字符和 0/1 序列之间建 ...

  3. 【转】刨根究底字符编码之九——字符编码方案的演变与字节序

    字符编码方案的演变与字节序 一.字符编码方案的演变 1. 根据前面的介绍,对于字符编码方案的演变,我们大致上可简单地划分为三个阶段: ① ASCII编码方案阶段 → ② ANSI编码方案阶段 → ③ ...

  4. Unicode、UTF-8、ASCII等编码方式浅述

    关于编码问题,虽然在开发中经常用到,但是对于各种编码方式的实现.相互之间的转换.在实际场景中的使用区别等方面并没有深刻的理解.今天针对Unicode.UTF-8.ASCII.ANSI.GB2312/G ...

  5. Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?(好)

    修改 Windows 记事本的 ANSI.Unicode.UTF-8 这三种编码模式有什么区别?修改 Windows 的记事本默认存储文本文档编码是 ANSI,想问一下为了最大跨平台兼容性,应该采用哪 ...

  6. python转换字符编码_转:Python常见字符编码及其之间的转换

    一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交 ...

  7. Python常见字符编码及其之间的转换

    参考:Python常见字符编码 + Python常见字符编码间的转换 一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Cod ...

  8. java学习笔记:常见字符编码和编码头BOM

    ANSI (American National Standards Institute,美国国家标准学会) ANSI编码标准是指所有从基本ASCII码基础上发展起来的编码标准, 比如扩展的ASCII码 ...

  9. Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码

    将字符转换为二进制码的过程,我们称为编码,将二进制码转换为字符的过程,我们称为解码. 编码和解码时所采用的规则,我们称为字符集 常见的字符集: ASCII - 美国人编码,使用7位来对美国常用的字符进 ...

最新文章

  1. 三维重建【四】-------------------结构光 三维重建----论文调研
  2. iOS绘制图片与文字
  3. boost::fusion::iterator_range用法的测试程序
  4. 时下最流行前端构建工具Webpack 入门总结
  5. 主板没有rgb接口怎么接灯_纯白信仰打造RGB主机,四件套提升100%性能-Thermaltake...
  6. matlab中创建一个工程,从文件夹创建新工程
  7. BZOJ 2287 POJ Challenge 消失之物
  8. linux添加一块硬盘分区,centos6中添加一块新的硬盘并分区的方法介绍
  9. JSP→JSTL标准标签库简介与环境搭建、JSTL助手EL表达式EL隐式对象、标签→out、set、if、多选择配合、foreach、redirect、格式化、JSTL函数标签、自定义标签、标签类架构
  10. android恢复出厂设置流程图,Android recovery模式
  11. qt实现windows系统下录屏功能
  12. Could not locate executable null\bin\winutils.exe in the Hadoop binaries解决方式
  13. 网易云课堂web安全第一天
  14. python tensorflow2 deeplearning 音频处理 声学事件检测
  15. 自动定量发表删除空间说说脚本代码
  16. 将消息转发到客服+php,将消息转发到微信客服
  17. jabcob 使用API
  18. IDA dword_xxx DCD 0xxxx用十六进制数表示的字符串解读
  19. 【方法】如何使用DeepMask和SharpMask
  20. 首个数字银行卡明年发行,广州出台区块链措施支持大湾区

热门文章

  1. css 动画中 ease,seae-in,ease-in-out,ease-out,解释
  2. 相机拍的图,电脑上画的图,word里的文字,电脑屏幕,手机屏幕,相机屏幕显示大小一切的一切都搞明白了!...
  3. 共享洗鞋柜物联网系统有哪些功能?
  4. 小马哥-------高仿HTC oneM7 手机 6589芯片详细拆机主板图
  5. 市值实现首度超越,Salesforce完胜甲骨文?
  6. 如何买开盘即涨停的个股
  7. cocos-js web开发泡泡龙游戏【一 加载游戏场景】
  8. 【转载】java报表工具报表软件选型经验总结分享
  9. Bluetooth Smart技术推动可穿戴设备在2014年增长67%
  10. 微博的自定义Android,Android ProgressBar 自定义样式(二),仿原来新浪微博图片加载样式...