php发展

首页 » 常识 » 常识 » 了不起的UnicodeCSDN
TUhjnbcbe - 2025/7/30 17:12:00
北京白癜风的有效治疗方法 http://www.ykhongye.com/m/

本文精心挑选了许多优秀的Unicode小技巧、软件包和资源。

译者

弯月,责编

郭芮

以下为译文:

Unicode非常了不起!在Unicode出现之前,国际交流是一团糟——每个人都在ASCII码表的后半部分区域(称为“代码页”)定义了自己的扩展和字符集,从而导致各种冲突。想想就知道,德国人要与韩国人只使用个字符组成的代码页进行交流会有多么困难。

——幸亏有了Unicode标准和统一的交流规范。

Unicode8.0根据多种书写体系,标准化了超过,个字符,其中包括现代字符、古代字符,甚至还包括人类尚未解密的文字。Unicode能处理从左到右和从右到左两种书写方式,支持组合标记,还支持多种文化、政治、宗教方面的字符,甚至还有表情符号。

Unicode太了不起了,我们对它的崇拜犹如滔滔江水绵绵不绝。

Unicode的背景

Unicode标准支持什么字符?

Unicode标准定义了今日所有主流的书写语言中用到的字符。Unicode支持的书写体系包括欧洲的语系、中东的从右至左书写的语系,以及亚洲的多种语系。

Unicode标准还包含了标点符号、声调符号、数学符号、科技符号、箭头、各种图形符号、表情符号,等等。Unicode为声调符号(用来改变其他字符的符号,如波浪线~)单独提供了代码,这些代码可以与基础字符组合使用,来表示有声调的字符(如)。Unicode标准9.0版总共提供了,个字符的代码,其中包括了全世界的字符、图形和符号。

绝大部分的常用字符都能映射到最前面的64K个代码点上,这一区域叫做基本多文种平面(basicmultilingualplane,简称为BMP)。还有十六个补充平面用来编码其他字符,目前尚有,个未使用的代码点。人们还在考虑在以后的版本中添加更多的字符。

Unicode标准还保留了一些代码点供私人使用。供应商或最终用户可以在内部利用这些代码点表示他们自己的字符和符号,或者通过特殊的字体来使用。BMP上有6,个私有代码点,如果不够的话,补充平面上还有,个私有代码点可供使用。

Unicode字符编码

字符编码标准不仅定义了每个字符的唯一标识(即字符的数字值,或者叫做代码点),也定义了怎样用比特来表示这个值。

Unicode标准定义了三种编码形式,允许同一个数据以一字节、两字节或四字节的格式来传输(即每个代码单元可以是8比特、16比特或32比特)。同一个字符集可以使用所有三种编码形式,它们之间可以互相转换,而不会丢失数据。Unicode联盟建议根据实际需要,选择任何一种方便的编码方式来实现Unicode标准。

UTF-8在HTML和类似协议上非常常用。UTF-8使用变长编码。它的优点是,对应于ASCII字符集的那些Unicode字符的字节值与它们在ASCII中的值完全相同,因此使用UTF-8编码的Unicode字符可以在绝大多数已有软件上使用,无需对软件做出任何修改。

UTF-16在许多需要平衡性能和存储效率的环境中非常常用。它足够紧凑,所有常用的字符都可以用一个16比特的代码单元来表示,其他字符可以使用一对16比特代码单元来表示。

UTF-32在无需顾虑内存空间的情况下使用,它是定长编码,每个字符只有一个代码单元。每个Unicode字符编码成一个32比特代码单元。

在所有三种编码中,每个字符最多需要4个字节(32比特)表示。

数字问题

Unicode字符集被分成17个核心段,称为“平面”,每个平面又被分成若干区块。每个平面的空间足够容纳65,()个代码点,因此总共有1,,个代码点。还有两个“私有区域”平面(#16和#17),可以按照使用者的意愿定义。这两个私有平面共包含,个代码点。

第一个平面叫做“基本多文种平面”,或者称为BMP。它包含代码点U+0到U+FFFF,这个范围内包含了绝大部分常用字符。另外16个平面(U+010到U+10FFFF)称为补充平面。

UTF-16代理对

“BMP之外的字符,例如U+1Dtetragramforcentre(),在UTF-16编码中只能编码成两个16比特代码单元:0xDxDF06。这种情况称为代理对(surrogatepair)。注意代理对只表示一个字符。“代理对的第一个字符永远在0xD到0xDBFF的范围内,称为高位代理,或者叫起始字节代理。代理对的第二个代码单元永远在0xDC00到0xDFFF的范围内,称为低位代理,或者叫末端代理。”

——MathiasBynens

“代理对:一种表示方式,用于表示由两个16比特代码单元组成的单个抽象字符,其中第一个值称为高位代理代码单元,第二个值称为低位代理单位。代理对仅在UTF-16中使用。”

——Unicode8.0第3.9章,代理对(参见Unicode编码)

计算代理对

代理字符PileofPoo(U+1F4A9)在UTF-16中必须编码成代理对,即两个代理。要将代码点转换成代理对,可以使用以下算法(用JavaScript编写)。注意我们使用的是十六进制表示。

varHigh_Surrogate=function(Code_Point){returnMath.floor((Code_Point-0x10)/0x)+0xD};varLow_Surrogate=function(Code_Point){return(Code_Point-0x10)%0x+0xDC00};//ReversesTheConversionvarCode_Point=function(High_Surrogate,Low_Surrogate){return(High_Surrogate-0xD)*0x+Low_Surrogate-0xDC00+0x10;};

varcodepoint=0x1F4A9;//0x1F4A9==169High_Surrogate(codepoint).toString(16)d83d//0xD83D==Low_Surrogate(codepoint).toString(16)dca9//0xDCA9==String.fromCharCode(High_Surrogate(codepoint),Low_Surrogate(codepoint));String.fromCodePoint(0x1F4A9)\ud83d\udca9

组合和解组合

Unicode包括了一种修改字符形状的机制,大幅扩展了Unicode支持的字符量。使用声调符号进行组合就是其中一种方式。声调符号写在主字符的后面。多个声调符号可以叠在同一个字符上。对于绝大部分常用的字母声调组合,Unicode还包括了预先组合好的版本。

特定的字符序列也可以用单个字符表示,称为“预组合字符”(或者叫组合字符,可以解组合的字符)。例如,字符“ü”可以编码成单个代码单元U+00FC“ü”,也可以编码成基本字符U+“u”后接无空白字符U+“¨”。Unicode标准中设置的预组合字符是为了兼容Latin1等标准,后者包含了许多预组合字符,如“ü”和“”。

预组合字符可以进行接组合,以保持一致性,或用于分析。例如,需要将一组名称转换为英文字母时,可以将字符“ü”解组合为“u”后接非空白字符“¨”。解组合后的结果很容易处理,因为该组合字符可以处理成“u”后接一个修饰字符。这样很容易进行按字母顺序排序等,因为修饰字符不会影响字母顺序。Unicode标准为所有预组合字符定义了解组合方式(

1
查看完整版本: 了不起的UnicodeCSDN