【问题标题】:Unicode characters (UTF-32) String encoding in NSRegularExpressionNSRegularExpression 中的 Unicode 字符 (UTF-32) 字符串编码
【发布时间】:2016-05-21 12:05:27
【问题描述】:

我正在为 Swift 中 Turtle 格式的 RDF 数据编写解析器。 Turtle Grammar 将模式PN_CHARS_BASE 定义为

[163s]  PN_CHARS_BASE ::= [A-Z] | [a-z] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]

(见W3C Turtle recommendation)。

模式[#x10000-#xEFFFF] 中的最后一组超出了UTF-16 字符串编码的范围。这里需要 UTF-32。

此模式用于匹配,例如foaf:name中的前缀字符串如foaf中的前缀中的第一个字符,此处不允许使用数字。

我想使用NSRegularExpression 来解析海龟文件。所以为了匹配PN_CHARS_BASE 模式,我有以下代码进行测试:

    let PN_CHARS_BASE = "[A-Z]|[a-z]|[\\u00C0-\\u00D6]|[\\u00D8-\\u00F6]|[\\u00F8-\\u02FF]|[\\u0370-\\u037D]|[\\u037F-\\u1FFF]|[\\u200C-\\u200D]|[\\u2070-\\u218F]|[\\u2C00-\\u2FEF]|[\\u3001-\\uD7FF]|[\\uF900-\\uFDCF]|[\\uFDF0-\\uFFFD]|[\\u10000-\\uEFFFF]"
    do {
        let teststr = "9"
        let regex = try NSRegularExpression(pattern: PN_CHARS_BASE, options: [])
        let matches = regex.matchesInString(teststr, options: [], range: NSMakeRange(0, teststr.characters.count)) as Array<NSTextCheckingResult>
    } catch {

    }

当我通过调试器运行它时,正则表达式会在测试字符串9 上返回一个结果。但是此模式不允许使用数字(因此正则表达式不应返回任何匹配项)。我删除了部分正则表达式模式以确定正则表达式的哪一部分与数字9 匹配,并发现正则表达式[\u10000-\uEFFFF] 的最后一部分与9 匹配。这是该模式中唯一采用 UTF-32 而不是 UTF-16 的部分,并且包括埃及象形文字等字符。

您知道NSRegularExpression 是否能够支持UTF-32 字符? 或者任何其他支持 UTF-32 匹配的解决方案?

【问题讨论】:

    标签: regex swift character-encoding nsregularexpression turtle-rdf


    【解决方案1】:

    我自己找到了答案。我需要以不同于 UTF-16 字符的格式指定 UTF-32 字符。

    不需要[\u10000-\uEFFFF],而是需要[\U00010000-\U000EFFFF] 来表达全范围的unicode 字符。 UTF-32 Unicode 代码点以转义大写字母 \U 开头,并且需要正好 8 个十六进制数字。

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 2013-01-16
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2017-11-29
      • 1970-01-01
      • 2015-07-15
      相关资源
      最近更新 更多