我一直在使用精神经典很长一段时间,最近开始学习 V2。两者都易于使用且功能强大,足以处理适度的解析 问题。
在精神经典和ascii角色的田园诗般的日子里, 这项工作只是使EBNF适应LL形式。但最后,我必须 处理i18n。
我的想法非常粗糙。创建一个迭代的前向迭代器 在任何编码的输入文本字节流上。迭代器处理 这些编码转换作业并使用utf16 / 32代码提供解析器 unit(迭代器可以通过iconv或icu4c轻松实现)。
代码单元的类型应该是解析器处理的内部char类型。 但通过阅读文档后,我只能找到几个 原始的迭代器模板有一个显式的char_t参数。是否 这意味着我必须重新制定那些数字,指令,扫描仪和 等?
我还检查了v2 doc。它提供了一种命名空间方式 一切都是一致的,但仍然没有太多关于如何明确 更改内部char类型。我再一次搜索了邮件列表 存档,但似乎那些unicode和其他编码相关的帖子是 还在空中。有人告诉我,精神仍然有效 通过那些具有不同编码的文件。所以我测试了解析器 使用具有不同编码但内容相同的文件。几个MBCS 编码文件通过测试,随便一些utf8文件也通过了。 但其他编码大部分时间都失败了。
答案 0 :(得分:1)
我怀疑你已找到char_ 和来自Boost Spirit网站的character encoding namespace。
最后一页包含有用的评论
“我们为Spirit支持的每个字符集都有一个命名空间。包括ascii,iso8859_1,standard和standard_wide(以及将来的unicode)。”
换句话说,提升精神目前并不真正支持unicode。这是他们的TODO名单。
与此同时,您可以尝试像这样的kludgy解决方法:
my_tag_ = lit("<") >> byte_ >> lit(">");
它将匹配恰好出现在尖括号之间的任何二进制字符串,前提是您不要在其上使用任何依赖于字符集的过滤器。