首页 > 代码库 > Welcome to Swift (苹果官方Swift文档初译与注解二十)---133~139页(第二章..本节完)

Welcome to Swift (苹果官方Swift文档初译与注解二十)---133~139页(第二章..本节完)

Unicode (Unicode码)

  Unicode是一种国际标准的文本编码.它的标准表中几乎包含所有语言的任意字符,并且可以通过扩展文件或者网页读写这些字符.

  在Swift中,String(字符串)类型和Character(字符)类型完全兼容Unicode,而且它们也支持非Unicode码.

Unicode Terminology (Unicode 术语)

  每个Unicode码都可以用一个或者多个Unicode标量表示.对于一个字符来说,一个Unicode标量都是一个唯一的21位的值(或名称),例如“ U+0061 表示 LOWERCASE LATIN      LETTER A ("a"),或者U+1F425 表示 FRONT-FACING BABY CHICK ("??").

  当一个Unicode字符串以文本文件或其他方式存储的时候,它们的Unicode标量也会以按照Unicode定义的格式进行编码.每种格式都使用叫做编码单元(code unit)的块来编码字符串.  这些格式里包括UTF-8格式(使用八位编码单元编码一个字符串)和UTF-16格式(使用十六位编码单元编码一个字符串)

Unicode Representations of Strings (字符串的Unicode表示)

  在Swift中,提供了几种不同的存取Unicode形式的字符串.

  你可以使用for-in语句来遍历字符串,来存取每个Unicode字符的字符值.

  或者也可以用下面的三种方式中的一个来存取Unicode字符串类型的值.

  • UTF-8 code units (使用字符串的  utf8 属性存取)
  • UTF-16 code units (使用字符串的  utf16 属性存取)
  • UTF-21 code units (使用字符串的  unicodeScalars 属性存取)

  下面的每个例子演示了字符串”Dog!??”的不同表示方式:

    let dogString = "Dog!??"

UTF-8

  使用utf8的属性可以按照UTF-8的形式来访问字符串.utf8属性的类型是UTF8View,它是一组无符号的8位数值(UInt8),每个值代表UTF-8的一个字节.

    for codeUnit in dogString.utf8 {

        print("\(codeUnit) ")

    }

    print("\n")

    // 68 111 103 33 240 159 144 182

  在这个例子中,codeUnit的前四个十进制的值(68 111 103 33)分别表示字符D,o,g和!.这与ASCII是一样的.codeUnit的后四个值(240 159 144 182)代表字符DOG FACE的UTF-8  四字节形式.

UTF-16

  使用字符串的utf16属性,可以按照UTF16方式存取字符串. utf16属性的类型是UTF16View,它是一组无符号16位数值(UInt16),一个值代表UTF16中的一个16位编码单元:

    for codeUnit in dogString.utf16 {

        print("\(codeUnit) ")

    }

    print("\n")

    // 68 111 103 33 55357 5637

  同样的,codeUnit的前四个值(68 111 103 33)表示字符D,o,g和!.这些和UTF-8是相同的.

  codeUnit的第十五和第十六个值是DOG FACE 的UTF-16替代表示:U+D83D(十进制值为55357)和U+DC36(十进制值为56374).

Unicode Scalars (Unicode 标量)

  通过unicodeScalars属性也可以访问存取字符串,这个属性的类型是UnicodeScalarView.

  每个 UnicodeScalar 都有一个value属性,它是一个UInt32的值,

      for scalar in dogString.unicodeScalars {

         print("\(scalar.value) ")

    }

    print("\n")

    // 68 111 103 33 128054

  UnicodeScalar的value属性的前四个值(68 111 103 33)与前面的两个例子相同,都是表示字符D,o,g和!,最后的值128054(十进制)是十六进制的1F436,表示 DOG FACE.

  通过value属性,每个UnicodeScalar的值也可以用来构建一个新的字符串:

    for scalar in dogString.unicodeScalars {

        println("\(scalar) ")

    }

    // D

    // o

    // g

    // !

    // ??”