【问题标题】:Validate Unicode code point in Swift在 Swift 中验证 Unicode 代码点
【发布时间】:2015-07-29 07:03:17
【问题描述】:

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

是否有一个 Swift(或 Foundation)函数我可以在飞行前调用整数 i 是一个有效的 Unicode 代码点并且不会导致 UnicodeScalar(i) 崩溃?

【问题讨论】:

    标签: swift unicode


    【解决方案1】:

    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。)

    【讨论】:

    • GeneratorOfOne(code) 略好于[code].generate()
    【解决方案2】:

    Swift documentation 状态

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

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

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

    【讨论】:

    • 好问题和解决方案!为了完整起见,我提供了一个替代答案。
    • 该功能现在“内置”在 Swift 3 中,见下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多