【问题标题】:UTF-8 match positionUTF-8 匹配位置
【发布时间】:2015-01-14 16:27:36
【问题描述】:

是否有可能在Ragel中获得匹配模式的字符位置?

我知道匹配接收到指向字符串 (char *) 的指针,即在字符串内部找到模式的字节偏移量。问题是 UTF-8 是可变长度编码,因此字符和字节不必对齐。

例如,如果我想在 €€$ 中搜索 $,我想得到 2,而不是 6($ → 0x24, → 0xE282AC)。

【问题讨论】:

    标签: regex utf-8 ragel


    【解决方案1】:

    Ragel 会生成一段紧凑的源代码,并嵌入到您喜欢的语言中。这段代码不使用任何库,既不是由 Ragel 提供的,也不是语言标准库提供的。因此,它无法解析 UTF-8 或计算 UTF-8 字符串的长度。

    不过,它可以做的是为您提供指向您感兴趣的字符串部分的指针。鉴于此,您可以使用您最喜欢的语言计算它的 UTF-8 长度- 特定工具。例如,在 C++ 中,您可以使用 cxxtools 的 Utf8Codec::do_length 方法(或您能想到的任何其他库)在 Ragel 代码返回给您后获取 €€ 片段的 UTF-8 长度。

    您还可以调整 Ragel 以使用 16 位字符并将 UCS-2 提供给它,as discussed by Wil Macaulay and Wincent Colaiuta。使用 UCS-4 的 32 位字符应该会更好。

    另一个角度可能是使用unicode2ragel.rb 脚本生成处理UTF-8 的状态机,并尝试对其进行修改以计算转换次数。 (我不知道这是否可行,我自己从未使用过该状态机)。

    【讨论】:

    • 有一件事我不明白。我上面的问题现在被写成隐含的假设(对不起!)我已经有一台匹配我感兴趣的一些模式的机器。我应该如何将我的机器与匹配 UTF-8 的机器结合起来,类似于对“unicode2ragel.rb”有什么作用?我应该同时计算每个机器规则和每个 UTF-8 规则中的代码点吗?
    • 由于我从未与unicode2ragel.rb 合作过,我建议在stackoverflow 上创建一个新的、更具体的问题供其他人回答。类似于举例说明如何将unicode2ragel.rb 机器合并到现有机器中以及如何使用它来计算代码点。
    猜你喜欢
    • 2011-08-28
    • 2023-03-27
    • 2012-06-20
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2013-03-02
    相关资源
    最近更新 更多