Unicode-为什么只有-还不够-的必要性及其优势-UTF (unicode编码)
Unicode 是一种字符编码标准,它为世界上几乎所有的文字和符号分配了唯一的数字编码。这使得不同的计算机系统和软件能够正确地显示和处理各种语言的文字。
Unicode 的必要性
为了理解 Unicode 的重要性,让我们考虑一个自定义的字符编码方案,其中:
- a 被编码为 1
- b 被编码为 2
- ... (以此类推)
- z 被编码为 26
虽然这个编码方案对于表示 26 个字母是足够的,但它对于其他字符就无法工作了。例如,单词 "add" 将被编码为 144,而 "hello" 将被编码为 85121215。这种编码方案存在歧义,因为同一个数字编码可以表示不同的字符组合,如 "heababo" 或 "heablo"。
UTF-8:解决 Unicode 编码问题的解决方案
为了解决 Unicode 编码的复杂性,Unicode 引入了 UTF(Unicode 转换格式),其中包括三种编码方式:
- UTF-32:固定 32 位编码,不足部分补充 0
- UTF-16:类似 UTF-32,但允许使用 16 位编码
- UTF-8:可变长度编码,最常见的一种
UTF-8 编码
UTF-8 是一种针对 Unicode 的可变长度字符编码,可以用来表示世界上几乎所有的字符。在 UTF-8 编码中,每个字符的编码长度可以是 1 个字节、2 个字节、3 个字节或 4 个字节。
UTF-8 编码规则如下:
UTF-8 编码根据 Unicode 字符的不同范围采用不同的字节长度:
- 0-127:1 个字节
- 128-2047:2 个字节
- 2048-65535:3 个字节
- 65536-1114111:4 个字节
这种编码方式确保了对于不同范围的 Unicode 字符,UTF-8 编码的字节数是不同的,从而实现了对 Unicode 字符集的高效编码和兼容性。
UTF-8 的优势
UTF-8 编码具有以下优势:
- 高效:它可以根据需要使用不同数量的字节,从而节省存储空间。
- 可变长度:它允许使用不同长度的字节来表示一个字符,从而可以灵活地处理不同范围的字符。
- 兼容性:它与 ASCII 码兼容,因为 ASCII 码中的字符在 UTF-8 中也使用单字节编码。
Unicode 和 UTF-8 的总结
Unicode 是一个字符集,它为世界上几乎所有的字符分配了一个唯一的标识符,以便计算机可以理解和处理各种语言的文本。Unicode 的目标是为全球范围内的每个字符提供一个唯一的标识符。
UTF-8 是一种 Unicode 的实现方式,它是一种可变长度的字符编码方式,可以用来表示 Unicode 标准中的字符。UTF-8 编码使用 1 到 4 个字节来表示一个字符,根据字符的不同范围来确定使用的字节数,这样可以节省存储空间并提高传输效率。
Unicode 的提出解决了传统字符编码方案的局限性,使得计算机可以更好地处理全球范围内的多语言文本。而 UTF-8 作为 Unicode 的一种实现方式,为文本的存储和传输提供了高效的解决方案。
utf-8 可以代替unicode吗?
utf-8是Unicode在计算机中实现存储的一种方式。
unicode与utf-8在现代编码模型处于不同的层次。unicode
现代编码模型
由统一码和通用字符集所构成的现代字符编码模型则没有跟从简单字符集的观点。
它们将字符编码的概念分为:
有哪些字符、
它们的编号、
这些编号如何编码成一系列的“码元”(有限大小的数字)
以及最后这些单元如何组成八位字节流。
区分这些概念的核心思想是创建一个能够用不同方法来编码的一个通用字符集。为了正确地表示这个模型需要更多比“字符集”和“字符编码”更为精确的术语表示。在Unicode Technical Report (UTR) #17中,现代编码模型分为5个层次,所用的术语列在下面:
抽象字符表(Abstract character repertoire)是一个系统支持的所有抽象字符的集合。字符表可以是封闭的,即除非创建一个新的标准(ASCII和多数ISO/IEC8859系列都是这样的例子),否则不允许添加新的符号,;字符表也可以是开放的,即允许添加新的符号(统一码和一定程度上代码页是这方面的例子)。特定字符表中的字符反映了如何将书写系统分解成线性信息单元的决定。例如拉丁、希腊和斯拉夫字母表分为字母、数字、变音符号、标点和如空格这样的一些少数特殊字符,它们都能按照一种简单的线性串行排列(尽管对它们的处理需要另外的规则,如带有变音符号的字母这样的特定串行如何解释——但这不属于字符表的范畴)。为了方便起见,这样的字符表可以包括预先编号的字母和变音符号的组合。其它的书写系统,如阿拉伯语和希伯莱语,由于要适应双向文字和在不同情形下按照不同方式交叉在一起的字形,就使用更为复杂的符号表表示
编码字符集(CCS:Coded Character Set)是将字符集中每个字符映射到1个坐标(整数值对:x, y)或者表示为1个非负整数。字符集及码位映射称为编码字符集。例如,在一个给定的字符表中,表示大写拉丁字母“A”的字符被赋予整数65、字符“B”是66,如此继续下去。多个编码字符集可以表示同样的字符表,例如ISO-8859-1和IBM的代码页037和代码页500含盖同样的字符表但是将字符映射为不同的整数。由此产生了编码空间(encoding space)的概念:简单说就是包含所有字符的表的维度。可以用一对整数来描述,例如:GB 2312的汉字编码空间是94 x 94。可以用一个整数来描述,例如:ISO-8859-1的编码空间是256。也可以用字符的存储单元尺寸来描述,例如:ISO-8859-1是一个8比特的编码空间。编码空间还可以用其子集来表述,如行、列、面(plane)等。编码空间中的一个位置(position)称为码位(code point)。一个字符所占用的码位称为码位值(code point value)。1个编码字符集就是把抽象字符映射为码位值。
如:Unicode(UCS)只是一个编码字符集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
字符编码表(CEF:Character Encoding Form),也称为storage format,是将编码字符集的非负整数值(即抽象的码位)转换成有限比特长度的整型值(称为码元code units)的串行。这对于定长编码来说是个到自身的映射(null mapping),但对于变长编码来说,该映射比较复杂,把一些码位映射到一个码元,把另外一些码位映射到由多个码元组成的串行。例如,使用16比特长的存储单元保存数字信息,系统每个单元只能够直接表示从0到65,535的数值,但是如果使用多个16位单元就能够表示更大的整数。这就是CEF的作用,它可以把Unicode从0到140万的码空间范围的每个码位映射到单个或多个在0到65,5356范围内的码值。最简单的字符编码表就是单纯地选择足够大的单位,以保证编码字符集中的所有数值能够直接编码(一个码位对应一个码值)。这对于能够用使用八比特组来表示的编码字符集(如多数传统的非CJK的字符集编码)是合理的,对于能够使用十六比特来表示的编码字符集(如早期版本的Unicode)来说也足够合理。但是,随着编码字符集的大小增加(例如,现在的Unicode的字符集至少需要21位才能全部表示),这种直接表示法变得越来越没有效率,并且很难让现有计算机系统适应更大的码值。因此,许多使用新近版本Unicode的系统,或者将Unicode码位对应为可变长度的8位字节串行的UTF-8,或者将码位对应为可变长度的16位串行的UTF-16。
码元(Code Unit,也称“代码单元”)是指一个已编码的文本中具有最短的比特组合的单元。对于UTF-8来说,码元是8比特长;对于UTF-16来说,码元是16比特长;对于UTF-32来说,码元是32比特长[1]。
Unicode(UCS)只是一个字符集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字“严”的unicode(UCS)码是十六进制数4E25,转换成二进制数足足有15位(0101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
为了解决这些问题,就出现了UTF。
UTF(Unicode Translation Format),它是Unicode(UCS)的实现(或存储)方式,称为Unicode转换格式。Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。
UTF有三种实现方式:
UTF-16:其本身就是标准的Unicode编码方案,又称为UCS-2,它固定使用16 bits(两个字节)来表示一个字符。
UTF-32:又称为UCS-4,它固定使用32 bits(四个字节)来表示一个字符。
UTF-8:最广泛的使用的UTF方案,UTF-8使用可变长度字节来储存Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。UTF-8更便于在使用Unicode的系统与现存的单字节的系统进行数据传输和交换。与前两个方案不同:UTF-8以字节为编码单元,没有字节序的问题。
参考搜索中文wiki
字符编码
UNICODE和UTF-8到底选择什么好
Unicode是计算机科学领域里的一项业界标准,包括字符集、编码方案等。 Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 UTF-8是一种针对Unicode的可变长度字符编码,又称万国码。 由Ken Thompson于1992年创建。 现在已经标准化为RFC 3629。 UTF-8用1到6个字节编码Unicode字符。 用在网页上可以统一页面显示中文简体繁体及其它语言。 UTF-8优点:UTF-8编码可以通过屏蔽位和移位操作快速读写,字符串比较时strcmp()和wcscmp()的返回结果相同,因此使排序变得更加容易。 UTF-8缺点:无法从UNICODE字符数判断出UTF-8文本的字节数。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。