码迷,mamicode.com
首页 > 编程语言 > 详细

Swift学习笔记-字符串和字符(Strings and Characters)-字符串的 Unicode 表示形式(Unicode Representations of Strings)

时间:2015-10-21 13:54:32      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

当一个 Unicode 字符串被写进文本文件或者其他储存时,字符串中的 Unicode 标量会用 Unicode 定义的几种编码格式编码。每一个字符串中的小块编码都被称为代码单元。这些包括 UTF-8 编码格式(编码字符串为8位的代码单元), UTF-16 编码格式(编码字符串位16位的代码单元),以及 UTF-32 编码格式(编码字符串32位的代码单元)。

Swift 提供了几种不同的方式来访问字符串的 Unicode 表示形式。 您可以利用for-in来对字符串进行遍历,从而以 Unicode 可扩展的字符群集的方式访问每一个Character值。 该过程在 使用字符 中进行了描述。

另外,能够以其他三种 Unicode 兼容的方式访问字符串的值:

  • UTF-8 代码单元集合 (利用字符串的utf8属性进行访问)
  • UTF-16 代码单元集合 (利用字符串的utf16属性进行访问)
  • 21位的 Unicode 标量值集合,也就是字符串的 UTF-32 编码格式 (利用字符串的unicodeScalars属性进行访问)

下面由D``o``g``?(DOUBLE EXCLAMATION MARK, Unicode 标量 U+203C)和?(DOG FACE,Unicode 标量为U+1F436)组成的字符串中的每一个字符代表着一种不同的表示:

let dogString = "Dog???"

 

UTF-8 表示

您可以通过遍历Stringutf8属性来访问它的UTF-8表示。 其为String.UTF8View类型的属性,UTF8View是无符号8位 (UInt8) 值的集合,每一个UInt8值都是一个字符的 UTF-8 表示:

Character D
U+0044
o
U+006F
g
U+0067
?
U+203C
??
U+1F436
UTF-8
Code Unit
68 111 103 226 128 188 240 159 144 182
Position 0 1 2 3 4 5 6 7 8 9
for codeUnit in dogString.utf8 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// 68 111 103 226 128 188 240 159 144 182

 

上面的例子中,前三个10进制codeUnit值 (68111103) 代表了字符Do和 g,它们的 UTF-8 表示与 ASCII 表示相同。 接下来的三个10进制codeUnit值 (226128188) 是DOUBLE EXCLAMATION MARK的3字节 UTF-8 表示。 最后的四个codeUnit值 (240159144182) 是DOG FACE的4字节 UTF-8 表示。

UTF-16 表示

您可以通过遍历Stringutf16属性来访问它的UTF-16表示。 其为String.UTF16View类型的属性,UTF16View是无符号16位 (UInt16) 值的集合,每一个UInt16都是一个字符的 UTF-16 表示:

Character D
U+0044
o
U+006F
g
U+0067
?
U+203C
??
U+1F436
UTF-16
Code Unit
68 111 103 8252 55357 56374
Position 0 1 2 3 4 5
for codeUnit in dogString.utf16 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// 68 111 103 8252 55357 56374

 

同样,前三个codeUnit值 (68111103) 代表了字符Dog,它们的 UTF-16 代码单元和 UTF-8 完全相同(因为这些 Unicode 标量表示 ASCII 字符)。

第四个codeUnit值 (8252) 是一个等于十六进制203C的的十进制值。这个代表了DOUBLE EXCLAMATION MARK字符的 Unicode 标量值U+203C。这个字符在 UTF-16 中可以用一个代码单元表示。

第五和第六个codeUnit值 (5535756374) 是DOG FACE字符的 UTF-16 表示。 第一个值为U+D83D(十进制值为55357),第二个值为U+DC36(十进制值为56374)。

Unicode 标量表示 (Unicode Scalars Representation)

您可以通过遍历String值的unicodeScalars属性来访问它的 Unicode 标量表示。 其为UnicodeScalarView类型的属性,UnicodeScalarViewUnicodeScalar的集合。 UnicodeScalar是21位的 Unicode 代码点。

每一个UnicodeScalar拥有一个value属性,可以返回对应的21位数值,用UInt32来表示:

Character D
U+0044
o
U+006F
g
U+0067
?
U+203C
??
U+1F436
UTF-16
Code Unit
68 111 103 8252 128054
Position 0 1 2 3 4
for scalar in dogString.unicodeScalars {
    print("\(scalar.value) ", terminator: "")
}
print("")
// 68 111 103 8252 128054

 

前三个UnicodeScalar值(68111103)的value属性仍然代表字符Dog。 第四个codeUnit值(8252)仍然是一个等于十六进制203C的十进制值。这个代表了DOUBLE EXCLAMATION MARK字符的 Unicode 标量U+203C

第五个UnicodeScalar值的value属性,128054,是一个十六进制1F436的十进制表示。其等同于DOG FACE的 Unicode 标量U+1F436

作为查询它们的value属性的一种替代方法,每个UnicodeScalar值也可以用来构建一个新的String值,比如在字符串插值中使用:

for scalar in dogString.unicodeScalars {
    print("\(scalar) ")
}
// D
// o
// g
// ?
// ??

 

Swift学习笔记-字符串和字符(Strings and Characters)-字符串的 Unicode 表示形式(Unicode Representations of Strings)

标签:

原文地址:http://www.cnblogs.com/emmet7life/p/4897419.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!