第十节 Unicode

原创
2014/06/24 16:10
阅读数 110

 

本文来自于疯子们的开源图书

 

Unicode是一种用于编码和表示文本的国际标准。它可以使你能够用一种标准化的方式表示任何语言中的几乎任何字符,同时允许从外部来源(文本文件或者网页)中读取和写入这些字符。

Swift的String和Character类型完全符合Unicode标准。他们支持不同种类的Unicode编码,下面有详细的描述:

Unicode的相关术语

Unicode中的每个字符都可以使用一个或者多个unicode标量来表示。一个unicode标量是一个唯一的21位编码,来表示一个字符或者某个修饰符,比如U+0061代表小写字母a("a"),U+1F425代表方块字符

当一个Unicode字符串被写到文本文件或其他外设里面的时候,就会用定义好的Unicode 格式对这些unicode标量进行编码。每种格式都是使用很小的块来编码字符串的,我们称这些块为编码单元。这些格式包括:UTF-8(使用8位的编码单元来编码字符串),UTF-16(使用16位编码单元编码字符串)。

字符串的Unicode表示

Swift提供了几种不同的方式来访问字符串的Unicode表示。

你可以使用for-in语句遍历一个字符串,来访问它的每个字符值(作为Unicode字符)。这个过程在字符处理一节有详细的介绍。

也可以通过下面三种与Unicode兼容的表示来访问一个字符串:

  • 一个由UTF-8编码单元构成的集合(通过字符串的utf8属性来访问)

  • 一个由UTF-16编码单元构成的集合(通过字符串的utf16属性来访问)

  • 一个由21位的Unicode标量值(通过字符串的unicodeScalars属性来访问)

接下来的例子,展示了由字符D,o,g,!,构成的字符串的几种不同的表示(DOG FACE,或者是Unicode 标量 U+1F436)。

UTF-8

通过遍历字符串的utf8属性来访问它的UTF-8表示这个属性是UTF8View类型的,由一系列的无符号8位UInt8值构成,每个对应于字符串的UTF-8编码中的一个字节。

在上面的例子中,前四个十进制的codeUnit的值(68,111,103,33)分别代表D,o,g和!,他们的UTF-8编码与ASCII编码是相同的。后四个codeUnit值(240,159,144,182)是DOG FACE(就是那个正方形的方块)字符的四字节UTF-8编码。

UTF-16

通过遍历Stringutf16属性可以获得他的UTF-16表示。这个属性是UTF16View,一个多个无符号16位UInt16值构成的序列,其中每个UInt16代表了字符串的UTF-16表示中的一个16位编码单元

前四个codeUnit值(68,111,103,33)表示字符D,o,g,他们的UTF-16编码单元与字符串的UTF-8表示有相同的值。

第五个和第六个codeUnit值(5535756374)表示的是方块字符。这些值是头代表值U+D83D(十进制的55357)和尾代表值U+DC36(十进制的56374)。

Unicode标量

可以通过遍历String的属性unicodeScalars属性值来获得他的Unicode标量值。这个属性UnicodeScalarView(由一系列的UnicodeScalar值构成)类型的。

每个UnicodeScalar都有一个value属性值,它返回一个UInt32类型的21位值。

前四个UnicodeScalar值(68,111,103,33)的value属性再一次表示了字符D,o,g!.第五个也是最后一个UnicodeScalar的value属性值是十进制的128054,等同于16进制的1F436,等同于Dog Face字符的Unicode标量U+1F436.

除了查询他们的value属性外,每个UnicodeScalar值可以用来构建一个新的String值。比如下面的字符串插入操作:


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部