【转】刨根究底字符编码之八——Unicode编码方案概述

Unicode编码方案概述

 

1.

前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但互相之间又不兼容的各种编码方案(微软统一称之为ANSI编码,具体体现为各种ANSI代码页)。

这样一来,同一个二进制编码在不同的ANSI编码方案中就有可能被解释成不同的字符,从而对采用不同ANSI编码方案的系统之间的数据交换带来了极大的不便。

比如大陆和台湾是只相隔150海里、使用着同一种语言的兄弟地区,也分别采用了不同的DBCS(Double Byte Character Set)双字节字符集编码方案。以前使用DOS操作系统的年代,大陆地区必须装上类似于“UCDOS希望汉字系统”这样的中文处理系统专门来处理采用GB类编码方案的汉字的显示、输入问题;而台湾地区由于采用BIG5编码方案(统一繁体字编码,俗称大五码,同样使用2个字节表示繁体汉字),则必须安装类似于“ET倚天汉字系统”这样的繁体中文处理系统才可以正确显示、输入采用BIG5编码方案的繁体汉字。

因此,要想打开一个文本文件,就必须首先知道它所采用的ANSI编码方案,否则用错误的ANSI编码方案进行解码,就会出现乱码。为什么早期的电子邮件常常出现乱码?多半是因为发信人和收信人使用的操作系统所采用的ANSI编码方案不一样。

2.

想象一下,如果有一种统一的编码方案,将世界上所有字符都纳入其中,每一个字符都给予一个全球独一无二的编码,那么乱码问题就会消失。于是,全球所有国家和地区使用的所有字符的统一编码方案诞生了。

最初,由世界上多家多语言软件开发商组成了统一码联盟(The Unicode Consortium),接着于1991年发布了The Unicode Standard(统一码标准),定义了一个全球统一的通用字符集,习惯简称为Unicode字符集(Unicode常被称为统一码、万国码、单一码,严格来说,这些称呼不够严谨或不够准确,因为Unicode字符集只是一个编号字符集CCS,尚未经过字符编码方式CEF和字符编码模式CES进行编码)。

接着,ISO及IEC也于1993年联合发布了一个标准号为ISO/IEC 10646-1的全球统一的通用字符集,称之为Universal Multiple-Octet Coded Character Set(通用多八位组编号字符集,习惯翻译为“通用多八位编码字符集”,但这里将Coded翻译为“编码的”极易误导人),简称为Universal Character Set(即通用字符集,缩写为UCS)。

后来,统一码联盟与ISO/IEC双方都意识到世界上没有必要存在两套全球统一的通用字符集,于是两者开始合作,共同为创立一个单一的全球统一的通用字符集而协同工作。到了Unicode 2.0标准发布时,Unicode字符集和UCS字符集(即ISO/IEC 10646-1)基本保持了一致。

虽然现在这两个标准仍然独立存在,但统一码联盟和ISO/IEC都同意保持两者的通用字符集相互兼容,并共同调整未来的任何扩展。

目前,Unicode的知名度要比UCS大得多,实践中的应用也更为广泛得多,已成为了全球统一的通用字符集或编码方案的代名词。因此,Unicode字符编码方案已经成为了全球统一字符编码方案事实上的标准。

 

3.

Unicode字符集的目标是涵盖目前人类使用的所有字符,并为每个字符分配唯一的字符编号(即码点编号、码点值),一一对应于编号空间(Code Space代码空间、码空间、码点空间)里的码点(Code Point代码点)。

目前,Unicode字符集将所有字符按照使用上的频繁度划分为了17个平面(Plane),每个平面上的编号空间有2^16=65536个码点。将来根据需要,还可扩展为更多平面。

(笨笨阿林原创文章,转载请注明出处)

4.

其中第0个平面BMP(Basic Multilingual Plane,也称为基本多语言平面、基本多文种平面,往往简称为基本平面、平面0),基本涵盖了当今世界上正在使用中的常用字符。我们平常用到的字符,一般都是位于BMP平面上的。

BMP平面以外其他的增补平面SP(Supplementary Plane,也称为辅助平面)要么用来表示一些非常特殊的字符(比如不常用的象形文字、远古时期的文字等),且多半只有专家在历史和科学领域里才会用到它们;要么被留作扩展之用。目前Unicode字符集的17个平面中尚有大量编号空间未被使用。

另外,BMP平面中有一个私用区(也称为专用区,即PUA:Private Use Area,也写作PUZ:Private Use Zone):0xE000~0xF8FF(十进制57344~63743),共6400个码点,被保留为私用,Unicode官方未将之分配给任何Unicode字符,因而可根据需要由合作者之间私下协商将其分配给私有字符(类似于Glyphicons、FontAwesome、fontello这样的私有图标字体字符,其码点就是使用的私用区中的码点);还有一个被称为代理区(Surrogate Zone)的特殊区域:0xD800-0xDFFF(十进制55296~57343),共2048个码点,这些码点被称之为代理码点,目的是用基本平面BMP中的两个码点“代理”表示BMP以外的其他增补平面SP中的字符(解释详见后文)。

(注:Unicode标准到目前为止实际上共定义了三个私用区:一个为如上所述的第0平面(即BMP)中的U+E000~U+F8FF,另外两个几乎包含了整个第15平面和第16平面,分别为U+F0000~U+FFFFD和U+100000~U+10FFFD。私用区相当于可以由Unicode官方之外的个人和机构自由定义字符的特殊区域,因此私用区中的同一个码点,可被分配给不同的字符,具体是哪个字符取决于字体文件,从而不同的用户由于安装了不同的字体文件,有可能所看到的字符也不同。)

Unicode字符集中的平面与字符映射范围

5.

Unicode字符集的字符编码方式一开始规定用两个字节的码元(即16位码元)来统一表示所有的字符(即UTF-16编码方式;注意:UTF-16编码方式要早于UTF-32、UTF-8编码方式出现,详见后文)。

对于ASCII字符,与前面介绍的ANSI编码一样,Unicode也保持其原编码不变(准确地说,应该是保持其“编号不变”,因为在传统字符编码模型中,编号与编码不作区分,说“编码不变”也勉强可以),只是在UTF-16字符编码方式中将其长度由原来的8位扩展为16位(注意,这里的字符编码方式CEF还只是逻辑意义上的码元序列,不是字符编码模式CES——即物理意义上的字节序列),而ASCII字符之外的其他字符则全部重新统一编码。

由于ASCII字符只需要用到UTF-16的16位编码中的低8位(即低字节),所以其高8位(即高字节)永远是0(实际上也只用到了低8位中的低7位,因此准确地说其高9位永远是0)。

6.

在Unicode标准最初推出的UTF-16字符编码方式中,无论是半角的英文字母,还是全角的汉字,它们都表示统一的“一个字符”,同时其编码也都是统一的“两个字节”(UTF-16属于双字节码元编码方式,而Unicode标准在UTF-16字符编码方式之后所推出的UTF-8字符编码方式则属于单字节码元编码方式,两者之间的关系与区别详见后文)。

请注意这里的“字符”和“字节”两个术语其意义上的不同:“字节”是一个与计算机相关的物理意义上的8位存储单元,而“字符”则是一个与文化相关的逻辑意义上的文字符号。

7.

在Unicode标准推出之前,那些做多语言国际软件的公司遇上过很大麻烦。他们为了在不同的国家销售同一套软件,就不得不特别注意字符编码的问题。不仅要处处小心不要搞错,还要把软件中的文字在不同的字符编码中转换来转换去,而Unicode标准的出现,提供了一个很好的一揽子解决方案。

于是从Windows NT开始,微软趁机把操作系统改了一遍,把所有的核心代码都改成了采用Unicode标准的版本(实际使用的就是Unicode标准的UTF-16字符编码方式CEF下的Little-Endian小端序字符编码模式CES,详见后文解释)。

从Windows NT开始,Windows系统终于不需要再加装各种本土语言系统(比如“UCDOS希望汉字系统”、“ET倚天汉字系统”之类的),就可以直接显示全世界所有的字符了。当然,为了保持兼容性,对于之前的ANSI编码方案,Windows同样进行了支持。

(笨笨阿林原创文章,转载请注明出处)

8.

Unicode在刚开始制订UTF-16字符编码时,并没有考虑与任何一种现有的字符编码保持完全兼容,比如GBK与Unicode在汉字的编码上是完全不一样的,没有任何一种简单的算法可以将文本内容在UTF-16编码和GBK编码之间进行直接转换,要转换的话只能通过查表这样低效率的笨办法一个字符对应一个字符地来进行。

即便是ASCII字符,也属于不完全的间接兼容或者说半兼容,因为UTF-16编码也是用两个字节来表示ASCII字符的,虽然其低7位与ASCII编码保持了一致,其余高位的9位均只是占位的0,但毕竟还是使用了16位共两个字节,不同于ASCII的单字节编码。正是鉴于此(当然除此之外还有其他原因),于是后来又设计了UTF-8字符编码方式,则实现了与ASCII编码的完全兼容(后文有详细解释)。

9.

从字符集的角度上来讲,Unicode字符集不同于ASCII这样不能再增加字符的封闭字符集,而是一个开放的字符集,是可以不断地增加字符的。因此Unicode字符集也在不断发展中(比如随着互联网即时聊天工具的发展而流行起来的很多Emoji表情符就不断地被增加到了Unicode字符集里),理论上支持的字符数量是没有上限的,未来还可再扩展。

(注意,很多文章中,有时候称字符集,有时候称字符编码方案,大致上来讲,字符集与字符编码方案经常被视为同义词,尤其是在传统字符编码模型中。但若深究起来的话,在现代字符编码模型中,由于字符集实际上为编号字符集CCS的简称,因此字符编码方案实际上涵盖了字符集。具体可参看前面对于现代字符编码模型的解释。)

Unicode字符集中的Emoji表情字符

10.

另外,与Unicode字符集基本保持兼容的ISO/IEC UCS字符集,最初先后定义了UCS-2(2-byte Universal Character Set)和UCS-4(4-byte Universal Character Set)两种编码方式。

UCS-2与之后定义的相当于是UCS-2的扩展版本的UTF-16编码方式很类似,与UTF-16的区别在于UCS-2没有定义代理区(详见后文中有关UTF-16编码方式的介绍),因此UCS-2只能编码基本平面BMP中的字符,无法编码增补平面SP中的字符,因而基本已被弃用;而UCS-4用四个字节中的31位来表示一个字符的码点编号,可表示21亿个不同的字符(2^31=2147483648;最高位为0,另有用途。UCS-4目前完全等同于UTF-32。

不过,实践中UCS字符集应用得不多,基本以Unicode字符集为主,因此了解一下即可,这里不作详细介绍。

11.

Unicode字符集不仅给每个字符根据其所在的码点分配了一个唯一的码点值(即码点编号,不严格地来讲,也勉强可认为是字符编号,注意不要跟UTF-16、UTF-8等字符编码方式CEF混淆了概念),而且赋予了一个正式的名称:在表示一个Unicode码点编号(或UCS码点编号)的十六进制数的前面加上“U+”,称之为码点名称,或字符名称(考虑到有部分码点实际上并未分配字符,因此应称为“码点名称”更为合适,但很多文章中都习惯称为“字符名称”)。

比如,U+0041表示英语大写字母A,U+4E25表示汉字“严”。具体的字符对应表,可以查询unicode.org,其中汉字部分也可查询专门的中日韩汉字Unicode编码表

Unicode字符集中的U+0000~U+007F(即十进制的0~127)与ASCII字符集(即ISO/IEC 646标准)是一致的,U+0000~U+00FF(即十进制的0~255)与ISO/IEC 8859-1字符集(即Latin-1字符集)也是一致的。

(笨笨阿林原创文章,转载请注明出处)

 

预告:下一篇将重点讲解令无数人头大的字节序(大端序、小端序),敬请关注!】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angular 自定义属性指令-禁止input框输入空格-以及删除复制内容中的空格

创建一个ts文件,并在module.ts中定义 import { Directive, ElementRef, HostListener, Input } from angular/core; import { FormGroup, FormControl, NgControl } from angular/forms; Directive({selector: [input-noSpace]}) export class NoSpace {constructo…

基于androidx的快速开发框架_Vue企业级优雅实战07框架开发03封装基于MockJS的模拟数据...

预览本文的实现效果:# giteegit clone gitgitee.com:cloudyly/dscloudy-admin-single.git# githubgit clone gitgithub.com:cloudyly/dscloudy-admin-single.gitgit checkout 05_MockJS本文主要内容:基于 Mock JS,优雅设计网络请求的模拟数据…

【转】Net Framework,Net Core 和 Net Standard 区别

前几天我在一个群里看到有关这方面的讨论,最后感觉讨论的不是很清晰,有幸的是我们的项目去年就开始迁移NetCore的调研了,我个人多多少少也是有过这方面的研究。下面我将说一下我自己对着三个的认识如果有不足的地方,请大家指出。 …

记录一次SQL优化,增加索引,随便写的当笔记了

写了一个SQL,前端往返时间大约1.7秒,最终优化到一共150毫秒左右,应该还可以更好一些 下面说的有点乱,有空再好好总结一下吧。参考文章里面写的还是比较好的,只不过没有组合查询。 参考链接:https://zhuan…

使用函数求最大公约数 pta_高中数学选修教材2-导数第6课时《函数的单调性与导数》教学设计...

选修2-2第一章1.3.1 函数的单调性与导数一、先复习一下,上节课讲到了利用导数求曲线的切线方程(点我),咱们这节课接着讲利用导数判断函数的单调性。二、做出图像形象生动,让学生看到当斜率为正(亦是导数为正)的时候函数图像是上升的&#xff…

java程序员_Java程序员工资为什么这么高?

众多行业中,程序员当然属于高薪职业。无论是国内还是国外,IT行业的程序员、工程师,甚至连码农都要比其他行业的从业者的收入高很多!尤其是作为IT界的“常青树”Java,原因是什么?01Java行业市场需求存在巨大…

【转】深入浅出OOP(六): 理解C#的Enums

MSDN定义:枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。 例如,假设您必须定义一个变量,该变量的值表示一周中的一天。 该变量只能存储七个有意义的值。 若要定义这些值&#xff…

usb接口供电不足_AMD RX 6000 系列显卡配备USB-C 接口,支持外接供电

IT之家 10 月 29 日消息 根据 AMD 的官方信息,新发布的 RX 6000 系列显卡进一步增强了显示能力,配备了 HDMI 2.1 接口、DP 1.4 接口和 USB-C 接口。AMD 表示,AMD Radeon 6000 系列显卡全部搭载 HDMI 2.1 VRR 接口,超大带宽支持最高…

【转】VS2005键盘布局_快捷键大全(总结了一些记忆的口诀)

VS快捷键对提高生产力有莫大帮助,本文将所有快捷键进行了重新整理归类,便于记忆。有缺失,不足之处,还请大家指出,谢谢 1、窗口快捷键 (W代表Windows也就是窗口的意思) CtrlW,A: 命令窗口&#…

mac securecrt程序无响应_如何重置mac上的系统管理控制器smc教程

虽然mac是一款十分高端的个人笔记本电脑,但是mac也会有出现故障的时候,比如风扇高速转动、键盘背光灯行为有些异常异常等等,那极有可能是你的系统管理控制器smc出现了问题,所以今天小编就来科普大家如何重置系统管理控制器smc。如…

bootstraptable treeGrid 懒加载_Java类加载机制及自定义加载器

一:ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中。jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式加载和显示加载。隐式加载:程序代码中不通过调用Clas…

Idea打可执行jar包

前些日子试了下idea打包,有些细节没太注意所以经常打包失败,要不然就是显示没有主清单属性,所以一直用eclipse打包,今天又重新捣鼓了一下,写下过程: 1. 先添加需要打jar包的主入口 第三步一定不要放在main…

安卓系统挂载NTFS格式硬盘_Mac 读写 NTFS硬盘管理开源工具NTFSTool

NTFSTool是Mac OS 下一款开源的 NTFS 磁盘格式读写工具,基于Electron和VUE编写。遵守MIT开源协议。支持 NTFS 磁盘读写、挂载,退出、管理等功能。系统检测到插入移动硬盘后,会自动弹出 NTFSTool 界面,并自动挂载硬盘。安装NTFSToo…

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

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

python人工智能_人工智能人才缺口千万!学Python抓住风口机会

前不久教育界的一个消息,引发了广泛的关注。今年9月,浙江三到九年级信息技术课将替换新教材,八年级将新增Python课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材规划五六年级开始接触…

【转】刨根究底字符编码之十——Unicode字符集的字符编码方式

一、字符编码方式CEF的选择 1. 由于Unicode字符集非常大(并且作为开放字符集还在不断扩展之中),有些字符的编号(即码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两个或两个以上字节。 比如,汉字“…

【转】刨根究底字符编码之十一——UTF-8编码方式与字节序标记BOM

一、UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8、UTF-16、UTF-32。这里先介绍应用最为广泛的UTF-8。 为满足基于ASCII、面向字节的字符处理的需要,Unicode标准中定义了UTF-8编码方式。UTF-8应该是目前应用最广泛的一种Unic…

流水灯verilog实验原理_IC设计实例解析之“流水线技术”

源自:微信公众号 “数字芯片实验室”在IC设计中,如果寄存器之间的组合逻辑延时过大,可能会称为设计中的关键路径,从而降低整个电路的工作频率。如下图所示,是一个输入和输出寄存的算术计算逻辑。在set_input_delay和se…

【转】刨根究底字符编码之十二——UTF-8究竟是怎么编码的

UTF-8究竟是怎么编码的 1. UTF-8编码是Unicode字符集的一种字符编码方式(CEF),其特点是使用变长字节数(即变长码元序列或称变宽码元序列)来编码。目前一般是1到4个字节,当然,也可以更长。 为什么要变长呢?这可以理解为按需分配…