UTF-8 匹配位置

UTF-8 match position

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

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

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

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

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

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

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