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

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

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

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
// ‼
// 🐶
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容