在Swift中验证Unicode代码点

时间:2015-07-29 07:03:17

标签: swift unicode

我在Swift中编写一个例程,需要尝试将任意整数转换为UnicodeScalar或返回错误。构造函数UnicodeScalar(_:Int)为有效的代码点完成工作,但是当传递的函数不是有效代码点时,它会崩溃。

是否有一个Swift(或Foundation)函数我可以调用pre-flight,整数i是一个有效的Unicode代码点,不会导致UnicodeScalar(i)崩溃?

2 个答案:

答案 0 :(得分:3)

Swift 3的更新:

UnicodeScalar现在有一个可用的初始化程序,用于验证是否存在 给定的数字是否是有效的Unicode代码点:

if let unicode = UnicodeScalar(0xD800) {
    print(unicode)
} else {
    print("invalid")
}

(上一个答案:)您可以使用内置的UTF32()编解码器来检查给定的整数 是一个有效的Unicode标量:

extension UnicodeScalar {
    init?(code: UInt32) {
        var codegen = GeneratorOfOne(code) // As suggested by @rintaro
        var utf32 = UTF32()
        guard case let .Result(scalar) = utf32.decode(&codegen) else {
            return nil
        }
        self = scalar
    }
}

(使用来自https://stackoverflow.com/a/24757284/1187415的提示 和https://stackoverflow.com/a/31285671/1187415。)

答案 1 :(得分:2)

Swift documentation

  

Unicode标量是U + 0000到的范围内的任何Unicode 代码点   U + D7FF包含或U + E000到U + 10FFFF包含。

对于Swift 2.0b4中这些范围内的所有值,UnicodeScalar构造函数不会崩溃。我使用这个方便的构造函数:

extension UnicodeScalar {
    init?(code: Int) {
        guard (code >= 0 && code <= 0xD7FF) || (code >= 0xE000 && code <= 0x10FFFF) else {
            return nil
        }
        self.init(code)
    }
}