标签:
当一个 Unicode 字符串被写进文本文件或者其他储存时,字符串中的 Unicode 标量会用 Unicode 定义的几种编码格式编码。每一个字符串中的小块编码都被称为代码单元。这些包括 UTF-8 编码格式(编码字符串为8位的代码单元), UTF-16 编码格式(编码字符串位16位的代码单元),以及 UTF-32 编码格式(编码字符串32位的代码单元)。
Swift 提供了几种不同的方式来访问字符串的 Unicode 表示形式。 您可以利用for-in来对字符串进行遍历,从而以 Unicode 可扩展的字符群集的方式访问每一个Character值。 该过程在 使用字符 中进行了描述。
另外,能够以其他三种 Unicode 兼容的方式访问字符串的值:
utf8属性进行访问)utf16属性进行访问)unicodeScalars属性进行访问)下面由D``o``g``?(DOUBLE EXCLAMATION MARK, Unicode 标量 U+203C)和?(DOG FACE,Unicode 标量为U+1F436)组成的字符串中的每一个字符代表着一种不同的表示:
let dogString = "Dog???"
您可以通过遍历String的utf8属性来访问它的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值 (68, 111, 103) 代表了字符D、o和 g,它们的 UTF-8 表示与 ASCII 表示相同。 接下来的三个10进制codeUnit值 (226, 128, 188) 是DOUBLE EXCLAMATION MARK的3字节 UTF-8 表示。 最后的四个codeUnit值 (240, 159, 144, 182) 是DOG FACE的4字节 UTF-8 表示。
您可以通过遍历String的utf16属性来访问它的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值 (68, 111, 103) 代表了字符D、o和g,它们的 UTF-16 代码单元和 UTF-8 完全相同(因为这些 Unicode 标量表示 ASCII 字符)。
第四个codeUnit值 (8252) 是一个等于十六进制203C的的十进制值。这个代表了DOUBLE EXCLAMATION MARK字符的 Unicode 标量值U+203C。这个字符在 UTF-16 中可以用一个代码单元表示。
第五和第六个codeUnit值 (55357和56374) 是DOG FACE字符的 UTF-16 表示。 第一个值为U+D83D(十进制值为55357),第二个值为U+DC36(十进制值为56374)。
您可以通过遍历String值的unicodeScalars属性来访问它的 Unicode 标量表示。 其为UnicodeScalarView类型的属性,UnicodeScalarView是UnicodeScalar的集合。 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值(68, 111, 103)的value属性仍然代表字符D、o和g。 第四个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