Swift5.1—字符串的Unicode表示形式

简介: Swift5.1—字符串的Unicode表示形式

当一个Unicode字符串被写进文本文件或者其它存储时,字符串中的Unicode标量会用Unicode定义的几种编码格式(encoding forms)编码。每一个字符串中的小块编码都被称代码单元(code units)。这些包括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表示


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


2466108-2a5019c2af640518.webp.jpg


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 表示。


**UTF-16 表示 **

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


2466108-1ccb5f01438334e3.webp.jpg


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)。


Unicode 标量表示


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


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


2466108-1ccb5f01438334e3.webp.jpg


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 iOS开发
10 Swift中的字符串
Swift中的字符串
82 0
|
17天前
|
Swift iOS开发
Swift 字符串
10月更文挑战第26天
27 3
|
Java Swift iOS开发
Swift - 字符串
Swift - 字符串
109 0
|
Swift 索引
Swift实用小册03:字符串的使用
Swift实用小册03:字符串的使用
225 0
Swift实用小册03:字符串的使用
|
存储 Swift
Swift5.1—子字符串
Swift5.1—子字符串
348 0
Swift5.1—子字符串
|
编译器 Swift
Swift5.1—字符串字面量
Swift5.1—字符串字面量
162 0
Swift5.1—字符串字面量
|
Swift
swift微博第2天(命名空间和控制器字符串)
swift微博第2天(命名空间和控制器字符串)
149 0
swift微博第2天(命名空间和控制器字符串)
【Swift4】(2) 运算符 | 字符串
【Swift4】(2) 运算符 | 字符串
128 0
Swift5.1—字符串前缀/后缀相等
Swift5.1—字符串前缀/后缀相等
271 0
|
Swift
Swift5.1—比较字符串
Swift5.1—比较字符串
651 0