【发布时间】:2015-01-14 16:27:36
【问题描述】:
是否有可能在Ragel中获得匹配模式的字符位置?
我知道匹配接收到指向字符串 (char *) 的指针,即在字符串内部找到模式的字节偏移量。问题是 UTF-8 是可变长度编码,因此字符和字节不必对齐。
例如,如果我想在 €€$ 中搜索 $,我想得到 2,而不是 6($ → 0x24,€ → 0xE282AC)。
【问题讨论】:
是否有可能在Ragel中获得匹配模式的字符位置?
我知道匹配接收到指向字符串 (char *) 的指针,即在字符串内部找到模式的字节偏移量。问题是 UTF-8 是可变长度编码,因此字符和字节不必对齐。
例如,如果我想在 €€$ 中搜索 $,我想得到 2,而不是 6($ → 0x24,€ → 0xE282AC)。
【问题讨论】:
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 的状态机,并尝试对其进行修改以计算转换次数。 (我不知道这是否可行,我自己从未使用过该状态机)。
【讨论】:
unicode2ragel.rb 合作过,我建议在stackoverflow 上创建一个新的、更具体的问题供其他人回答。类似于举例说明如何将unicode2ragel.rb 机器合并到现有机器中以及如何使用它来计算代码点。