美文网首页
字符串中的Unicode

字符串中的Unicode

作者: 小金_1180 | 来源:发表于2018-06-21 16:36 被阅读0次

    当把一个Unicode字符串写入文本文件或者以其他形式存储,字符串中的Unicode标量会被编码成Unicode定义的几种编码形式中的一种。每一种字符串编码形式都把字符串编码成更小块的编码单元。其中有:

        UTF-8编码:把一个字符串以8位的一个编码单元进行编码

        UTF-16编码:把一个字符串以16位的一个编码单元进行编码

        UTF-32编码:把一个字符串以32位的一个编码单元进行编码

    Swift提供了几种不同的方式去访问字符串的Unicode表示。我们可以使用for-in语句遍历字符串,然后去访问每一个字符的Unicode字形集。

    当然,我们也可以使用洗面3中Unicode兼容的方式去访问字符串的值:

        一个UTF-8编码单元的集合,通过属性 utf8 获取

        一个UTF-16编码单元的集合,通过属性 utf16 获取    

        一个21位的Unicode标量值组成的集合,和UTF-32编码形式相等,通过属性 unicodeScalars获取

    下面的每一个例子展示了下方字符串的不同的表示,一个由字符D,o,g,!!和🐶组成的字符串。

        let dogString = "Dog‼🐶"

UTF-8表示

    可以通过遍历属性uft8获得字符串的UTF-8的表示。这个属性是一个String.UTF8View类型的值,是一组8位无符号数字的集合。下图说明了每一个无符号数字和字符串UTF-8表示的对应关系:

                for codeUnit in dogString.utf8 {

                    print("\(codeUnit) ", terminator: "")

               }

                // 打印 "68 111 103 226 128 188 240 159 144 182 ”

    上面的例子中,开始三个数字编码单元(68, 111, 103)代表了字符D,o,g,这里的UTF-8表示和ASCII表示是一样的。接下来的三个数字编码单元(226, 128, 188)是一个3字节的UTF-8表示,代表了DOUBLE EXCLAMATION MARK(!!)字符。最后的4个编码单元(240, 159, 144, 182)是一个4字节UTF-8表示,代表了DOG FACE🐶字符。

UTF-16表示

    可以通过遍历属性uft16获得字符串的UTF-16的表示。这个属性是一个String.UTF16View类型的值,是一组16位无符号数字的集合,下图说明了每一个无符号数字和字符串UTF-16表示的对应关系:

        for codeUnit in dogString.utf16 {

            print("\(codeUnit) ", terminator: "")

        }

        // 打印 "68 111 103 8252 55357 56374 ”

    相同的,开始的三个编码单元(68, 111, 103) 代表了字符D,o,g,和UTF-8中的表示相同,都等于ASCII的表示。

    第四个编码单元(8252)在数值上等于16进制的203C,表示了Unicode标量U+203C也就是字符DOUBLE EXCLAMATION MARK(!!),这个字符在UTF-16中可以用一个代码单元来表示。

    第5个和第6个编码单元(55357,56374)DOG FACE🐶在UTF-16中的代理对的表示。这里是一个高代理点U+D83D(55357)和一个低代理点U+DC36 (56374)。

Unicode标量表示

     可以通过遍历属性unicodeScalars获得字符串的Unicode标量表示。这个属性是一个UnicodeScalarView类型的值,是一组unicode标量的集合。

    每一个Unicode标量的value属性会返回一个21位的标量的值,表示了一个UInt32的值。

        for scalar in dogString.unicodeScalars {

            print("\(scalar.value) ", terminator: "")

        }

        // 打印 "68 111 103 8252 128054 ”

    同样,开始三个Unicode标量(68, 111, 103)还是代表了字符D,o,g。

    第4个编码单元(8252),还是和16进制的203C相等,表示了Unicode标量U+203C也就是字符DOUBLE EXCLAMATION MARK(!!)

    第5个编码单元(128054)在数值上等于16进制的1F436,表示了Unicode标量U+1F436,也就是字符DOG FACE(🐶)

    和获取Unicode编码单元的value属性不一样,每一个Unicode编码单元都可以被用来构造一个新的字符串,比如字符串插入:

        for scalar in dogString.unicodeScalars {

            print("\(scalar) ")

        }

        // D

        // o

        // g

        // ‼

        // 🐶

相关文章

网友评论

      本文标题:字符串中的Unicode

      本文链接:https://www.haomeiwen.com/subject/fcgqyftx.html