Swift 3中的所有UTF8字形

时间:2016-10-03 11:02:29

标签: swift utf-8

如何使用swift 3打印所有utf8 glyphs

使用它会太慢/耗时:

let G = "\u{0047}" // "G"

有更短/更优雅的方式吗?

2 个答案:

答案 0 :(得分:1)

您可以使用UnicodeScalar类型使用数值创建字符串。并迭代您感兴趣的范围的值。根据Swift String文档,Unicode标量定义为范围U + 0000到U + D7FF和U + E000到U + 10FFF。请参阅:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html

  

请注意

     

Unicode标量是U + 0000到的范围内的任何Unicode代码点   U + D7FF包含或U + E000到U + 10FFFF(含)。 Unicode标量   不包括Unicode代理对代码点,这是代码   U + D800到U + DFFF范围内的点。

let range1From = Int("0", radix: 16)
let range1To = Int("D7FF", radix: 16)

print("Code points from U+0000 to U+D7FF")

for var code in stride(from: range1From!, to: range1To!, by: 1) {
    if let scalar = UnicodeScalar(code) {
        var string = "\(scalar)"
        print(string)
    }
}

print("Code points from U+E000 to U+10FFFF")

let range2From = Int("E000", radix: 16)
let range2To = Int("10FFFF", radix: 16)

for var code in stride(from: range2From!, to: range2To!, by: 1) {
    if let scalar = UnicodeScalar(code) {
        var string = "\(scalar)"
        print(string)
    }
}

请注意,大多数代码点都是空的,有些可能无法在控制台上显示。您可能希望更改第二个循环中步幅的by值以快速查看:

for var code in stride(from: range2From!, to: range2To!, by: 100) {

这将显示可用的全部Unicode代码点,具体取决于您的需求,您可能只对U + 0000到U + D7FF范围(甚至是范围内)感兴趣。只需使用您感兴趣的范围值更改range1From和range1To常量的值。

答案 1 :(得分:1)

试试这个:

let n = 1000

for i in 1...n {
    if let scalar = UnicodeScalar(i) {
        let str = String(stringInterpolationSegment: scalar)
        print(str)
    }
}

Unicode目前定义了17个平面,可以存储大约1M个字符,但是only about 10% of that is allocated。您还可以组合多个代码点来创建单个字符(从技术上讲,字形集群)。尽管使用了2个标量,但这定义了单个字符:

let char = "a\u{33c}"
print(char)                   // a̼
print(char.characters.count)  // 1

Unicode是一个非常奇怪的野兽!