Unicode(也称为Unicode、Universal Code和Single Code)是计算机科学领域的行业标准,包括字符集和编码方案。Unicode的诞生是为了解决传统字符编码方案的局限性。
它为每种语言中的每个字符设置了统一的、唯一的二进制代码,以满足跨语言、跨平台的文本转换和处理的要求。1990年开始研发,1994年正式公布。
(资料图片)
一、起源
因为计算机只能处理数字,所以如果要处理文本,必须先把文本转换成数字,然后才能处理。最早的计算机是以8位为一个字节设计的。
一个字节可以表示的最大整数是255(2 ^ 8-1=255),而ASCII编码占用0127来表示大小写英文字母、数字和一些符号。这个编码表称为ASCII编码。
例如,大写字母A编码为65,小写字母Z编码为122。
如果要表示中文,显然一个字节不够,至少需要两个字节,而且不能和ASCII编码冲突。因此,我国制定了GB2312的编码来对中文进行编码。
同样,日语、韩语等其他语言也有这个问题。为了统一所有字符的编码,Unicode应运而生。Unicode将所有语言统一到一组代码中,因此不会再有乱码问题。
Unicode通常用两个字节来表示一个字符,而原来的英文编码从单字节变成了双字节,只是把所有的高字节都填零。
因为Python诞生在Unicode标准发布之前,最早的Python只支持ASCII编码,普通字符串‘ABC’在Python内部都是ASCII编码。
Unicode的出现是为了解决传统字符编码方案的局限性。例如,尽管ISO 8859定义的字符在不同的国家被广泛使用,但它们在不同的国家经常是不兼容的。
许多传统的编码方法都有一个共同的问题,就是允许计算机处理双语环境(通常使用拉丁字母及其本地语言),但不能同时支持多语言环境(指可以同时混合多种语言的情况)。
Unicode编码包含不同书写风格的单词,例如“A/”和“胡/胡/胡”。但在汉字方面,一字多形的认定存在争议。
在字处理中,Unicode为每个字符而不是字体定义了唯一的代码(即整数)。换句话说,Unicode以一种抽象的方式处理字符(即数字)。
并留下视觉演绎工作(如字号、外观造型、字体形式、风格等。)到其他软件,如网络浏览器或文字处理器。
几乎所有的计算机系统都支持基本的拉丁字母,并且每个系统都支持不同的其他编码方法。为了与它们兼容,Unicode的前256个字符是为ISO 8859-1定义的字符保留的。
因此现有西欧语言的转换不需要特别考虑;大量相同的字符被重复编码成不同的字符码,这样旧的复杂编码方法可以直接从Unicode编码转换过来,而不会丢失任何信息。举个例子,
全角格式部分包含主要拉丁字母的全角格式。在中文、日文和韩文字形中,这些字符以全角模式呈现,而不是常见的半角模式,在竖排文字和等宽排列中起着重要作用。
当表示Unicode字符时,该字符通常用“u”后跟一组十六进制数来表示。在基本多语平面(英语是基本多语平面,缩写为BMP)。
它又简称为“零号平面”, plane 0)里的所有字符,要用四位十六进制数(例如U+4AE0,共支持六万多个字符);在零号平面以外的字符则需要使用五位或六位十六进制数了。
旧版的Unicode 标准使用相近的标记方法,但却有些微的差异:在Unicode 3.0 里使用“U-”然后紧接着八位数,而“U+”则必须随后紧接着四位数。
二、作用
能够使计算机实现跨语言、跨平台的文本转换及处理。
三、层次
Unicode 编码系统,可分为编码方式和实现方式两个层次。
四、方式
Unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode 字符分为17 组编排,0x0000 至0x10FFFF,每组称为平面(Plane),
而每平面拥有65536 个码位,共1114112 个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32 都是将数字转换到程序数据的编码方案。
通用字符集(Universal Character Set, UCS)是由ISO 制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2 用两个字节编码,
UCS-4 用4 个字节编码。
历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟。前者开发的ISO/IEC 10646 项目,后者开发的统一码项目。
因此最初制定了不同的标准。
1991 年前后,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。于是,它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode 2.0 开始,
Unicode 采用了与ISO 10646-1 相同的字库和字码;ISO 也承诺,ISO 10646 将不会替超出U+10FFFF 的UCS-4 编码赋值,以使得两者保持一致。两个项目仍都存在,
并独立地公布各自的标准。但统一码联盟和ISO/IEC JTC1/SC2 都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。在发布的时候,Unicode 一般都会采用有关字码最常见的字型,
但ISO 10646 一般都尽可能采用Century 字型。
UCS-4 根据最高位为0 的最高字节分成27=128 个组(group)。每个group 再根据次高字节分为256 个平面(plane)。
每个平面根据第3 个字节分为256 行(row),每行有256 个码位(cell)。group 0 的平面0 被称作BMP(Basic Multilingual Plane)。
如果UCS-4 的前两个字节为全零,那么将UCS-4 的BMP 去掉前面的两个零字节就得到了UCS-2。每个平面有216=65536 个码位。Unicode 计划使用了17 个平面,
一共有1765536=1114112 个码位。在Unicode 5.0.0 版本中,已定义的码位只有238605 个,分布在平面0、平面1、平面2、平面14、平面15、平面16。
其中平面15 和平面16 上只是定义了两个各占65534 个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD 和0x100000-0x10FFFD。
所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。
平面0 也有一个专用区:0xE000-0xF8FF,有6400 个码位。平面0 的0xD800-0xDFFF,共2048 个码位,是一个被称作代理区(Surrogate)的特殊区域。
代理区的目的用两个UTF-16 字符表示BMP 以外的字符。在介绍UTF-16 编码时会介绍。
如前所述在Unicode 5.0.0 版本中,238605-65534*2-6400-2048=99089。余下的99089 个已定义码位分布在平面0、平面1、平面2 和平面14 上,
它们对应着Unicode 定义的99089 个字符,其中包括71226 个汉字。平面0、平面1、平面2 和平面14 上分别定义了52080、3419、43253 和337 个字符。
平面2 的43253 个字符都是汉字。平面0 上定义了27973 个汉字。
在Unicode 中:汉字“字”对应的数字是23383(十进制),十六进制表示为5B57。在Unicode 中,我们有很多方式将数字23383 表示成程序中的数据,
包括:UTF-8、UTF-16、UTF-32。UTF 是“Unicode Transformation Format”的缩写,可以翻译成Unicode 字符集转换格式,
即怎样将Unicode 定义的数字转换成程序数据。
例如,“汉字”对应的数字是0x6c49 和0x5b57,而编码的程序数据是:
这里用char、char16_t、char32_t 分别表示无符号8 位整数,无符号16 位整数和无符号32 位整数。
UTF-8、UTF-16、UTF-32 分别以char、char16_t、char32_t 作为编码单位。(注: char16_t 和char32_t 是C++ 11 标准新增的关键字。
如果你的编译器不支持C++ 11 标准,请改用unsigned short 和unsigned long。)“汉字”的UTF-8 编码需要6 个字节。
“汉字”的UTF-16 编码需要两个char16_t,大小是4 个字节。“汉字”的UTF-32 编码需要两个char32_t,大小是8 个字节。根据字节序的不同,
UTF-16 可以被实现为UTF-16LE 或UTF-16BE,UTF-32 可以被实现为UTF-32LE 或UTF-32BE。
下面介绍UTF-8、UTF-16、UTF-32、字节序和BOM。
UTF-8
UTF-8 以字节为单位对Unicode 进行编码。从Unicode 到UTF-8 的编码方式如下:
Unicode 编码(十六进制)
UTF-8 字节流(二进制)
000000-00007F
0
本文unicode是什么格式,Unicode是什么到此分享完毕,希望对大家有所帮助。