如何使用ANTLR4正确解析包含3字节UTF8中文字符的字符串
问题原因
报错的核心原因是ANTLR4 C++ Runtime默认的ANTLRInputStream将输入字符串按单字节Latin-1编码处理,你传入的是UTF8编码的中文字符,3字节的中文会被拆分为3个独立的单字节字符,和词法规则中.匹配单个Unicode码点的逻辑不匹配,最终触发词法识别错误。
修改方案
1. 替换输入流实现(核心修改)
把代码中的ANTLRInputStream替换为专门处理UTF8编码的UTF8InputStream,同时补充对应的头文件引用即可。修改后的测试代码如下:
#include "MyLexer.h" #include "MyParser.h" #include <string> #include "antlr4/UTF8InputStream.h" using namespace My; int main() { std::string s = "'中'"; antlr4::UTF8InputStream input(s); MyLexer lexer(&input); antlr4::CommonTokenStream tokens(&lexer); MyParser parser(&tokens); parser.string(); return 0; }
2. 生成语法代码时指定编码(可选,避免语法文件本身的中文识别问题)
运行antlr4命令生成C++代码时,添加-encoding UTF-8参数,确保语法文件按UTF8编码解析:
antlr4 -Dlanguage=Cpp -encoding UTF-8 My.g4
3. 旧版本Runtime兼容方案
如果你使用的ANTLR4 C++ Runtime版本低于4.10,没有提供UTF8InputStream,可以先将UTF8编码的std::string转换为std::u32string,再传入ANTLRInputStream,保证每个字符对应一个Unicode码点即可正常匹配。
内容的提问来源于stack exchange,提问作者user9634413
相关产品推荐
相关产品推荐

