美文网首页
浅谈unicode

浅谈unicode

作者: 迷途的探险家 | 来源:发表于2019-08-19 10:20 被阅读0次

    Unicode provides a unique number for every character, no matter what the platform, program, or language is.

            摘自Unicode官方描述。大意是:Unicode为任意一个符号提供唯一的数字,可以是平台、程序、语言出现的任意符号。

    1、unicode解决什么问题?

            从根本上说,计算机只处理数字。它们通过为每个字符分配一个编号(数字)来存储字母和其他字符。在开发Unicode标准之前,有许多不同的系统,称为字符编码,用于分配该系统编号,如ASCII、ISO-8859-1、GBK等。这些早期的字符编码是有局限性的,并没有涵盖所有世界语言的字符。即使对于像英语这样的单一语言,也没有单一的编码涵盖了常用的所有字母,标点符号和技术符号。诸如中日韩语之类的象形语言是支持这些早期编码标准的挑战;早期的字符编码也相互冲突。也就是说,两个编码可以对两个不同的字符使用相同的编号,或者对同一个字符使用不同的编号。任何给定的计算机可能必须支持许多不同的编码。但是,当在计算机和不同编码之间传递数据时,会增加数据损坏或错误的风险。unicode旨在涵盖所有字符,并为其提供唯一编号。

    2、字符集结构说明

            字符集只是一个规则集合的名字,对应到真实生活中,字符集就是对某种语言的称呼。例如:英语,汉语,日语。对于一个字符集来说(尤其是unicode)要正确编码转码一个字符需要三个关键元素:

    字库表(character repertoire): 一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围。

    编码字符集(coded character set): 即用一个编码值code point来表示一个字符在字库中的位置,也就是我们前面说到的编号。unicode的编码方式与 ISO 10646 的UCS-2相对应。给每个字符分配一个代码,而且赋予了一个正式的名字。表示一个UCS或Unicode值的十六进制数通常在前面加上“U+”,例如“U+0041”代表字符“A”。

    字符编码(character encoding form): 将编码字符集和实际存储数值之间的转换关系,一般来说都会直接将code point的值作为编码后的值直接存储。

    或许你跟我一样有过这样的疑问:字库表和编码字符集看来是必不可少的,那既然字库表中的每一个字符都有一个自己的编号,直接把编号作为存储内容就好了。为什么还要多此一举通过字符编码把编号转换成另外一种存储格式呢?

    统一字库表的目的是为了能够涵盖世界上所有的字符,但实际使用过程中会发现真正用的上的字符相对整个字库表来说比例非常低。比如说在使用英语的国家,你可以认为只用ASCII字库表就能基本满足基本需求,在存储上只需要一个字节即可;但一些如中文是需要2到3个字节存储的。如果简单进行编号存储,那么必须要使用最大字节长度进行存储。这样会造成极大的存储浪费。

    结构图


    3、utf-8 与 unicode

            utf-8的全称:8-bit Unicode Transformation Format,从名字上解释utf-8和Unicode的关系就比较简单了。Unicode就是上文中提到的编码字符集,而utf-8就是字符编码,即Unicode规则字库的一种实现方式;从结构体系上理解,utf-8只是实现方式的其中一个,其他类似如:utf-16、utf-32等等

    4、ASCII码和unicode

            ASCII码作为早期字符集的存在,使用面是非常广泛的,在字符集结构里,ASCII字符集的编码字符集和字符编码是一样的。unicode在字符收集时,保留了ASCII码的编码字符集(字符和编号的关系)。所以很多时候我们提到的ASCII码只是一个字典表,不代表我们使用ASCII字符集。

    5、BMP与supplementary characters

            unicode的编码方式既然是用utf-16,那么所能表示的范围是 U+0000 到 U+FFFF 之间,unicode定义了Basic Multilingual Plane (BMP)用于表示这个范围,更多的Plane定义可以查阅unciode官网。code point 大于 U+FFFF的字符被称为supplementary characters。 supplementary characters是由一对字符组成: high-surrogates range, (\uD800-\uDBFF) 和 low-surrogates range (\uDC00-\uDFFF)。BMP其实已经囊括了大部分常用的字符,所以我们其实很少用得到 supplementary characters。当然了,也用使用场景的,比如部分中文生僻字,emoji不属于BMP部分,你甚至可以在Java,Javascript里获取这类字符串的长度,会得到意想不到的结果,有兴趣的可以尝试:"𡃁".length()

    结束

    unicode是一个世界性课题,ta会囊括很多信息,不太可能一两篇文章就能说清楚,本文旨在简单了解在工作中能接触的部分。谢谢您的阅读,如有疑问请给我留言,谢谢。

    参考:

    https://unicode.org/charts/

    https://zh.wikipedia.org/zh-hans/Unicode

    https://zh.wikipedia.org/zh-hans/UCS

    https://linux.cn/article-5027-1.html

    https://linux.cn/article-3500-1-rel.html

    相关文章

      网友评论

          本文标题:浅谈unicode

          本文链接:https://www.haomeiwen.com/subject/dbanjctx.html