【发布时间】:2020-10-10 20:48:59
【问题描述】:
我正在编写一个词法分析器,用于解析 C++ 中的给定字符串。我有一个字符串
line = R"(if n = 4 # comment
return 34;
if n≤3 retur N1
FI)";
我需要做的就是在一个向量中输出所有单词、数字和标记。
我的程序使用常规标记、单词和数字;但我不知道如何解析 Unicode 字符。我的程序需要保存在向量中的唯一 Unicode 字符是 ≤ 和 ≠。
到目前为止,我所有的代码基本上都是逐行读取字符串,读取第一个单词、数字或标记,将其切掉并递归地继续吃标记,直到字符串为空。我无法将line[0] 与≠ 进行比较(当然),而且我也不清楚为了摆脱Unicode 字符需要剪掉多少字符串?如果是"!=",我只需删除line[0] 和line[1]。
【问题讨论】:
-
您的字符串是否编码为 UTF-8?如果是这样,请参阅 this post 以了解如何通过名为
widen的函数将它们转换为std::wstring。这些将更容易处理。 -
@PaulSanders。我不同意,请参阅utf8everywhere.org。 utf8 可能有问题的唯一架构是在 MS-Windows 下。但是 Windows 使用 utf16 表示
std::wstring,这是两全其美的。你仍然有多字节的问题,有趣的字节顺序添加等等。 -
@PaulSanders 转换为 UTF-16 并不能解决问题,因为您仍然需要处理 BMP 之外的字符。 UTF-16 不是固定宽度的编码,你只需要读取 2 个字节
-
@phuclv 我没有说我正在转换为 UTF-16。引用的代码转换为
std::wstring。也就是说,在 UTF-16 中处理 BMP 之外的字符并不困难,因为用于代理对中各个代码单元的值在明确定义的范围内。 -
@PaulSanders 然后处理 UTF-8 更容易,因为范围也定义明确