UTF-8匹配位置

时间:2015-01-14 16:27:36

标签: regex utf-8 ragel

以某种方式可以在Ragel中获得匹配模式的字符位置吗?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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