我正在开发一个基本的手工编码词汇扫描器,并希望支持 UTF-8 输入(它不再是 1970 年了!)。stdin
一次从一个文件中读取输入字符,然后将其推入缓冲区,直到看到空格等。我考虑为此编写自己的包装器fgetc()
,而不是返回char[]
构成 UTF-8 字符并与结果作为一个字符串......这很容易,但会变成一个滑坡。我不想浪费时间重新发明轮子,而是使用现有的、经过测试的库,如ICU。所以现在我有一个非 UTF-8 支持代码,它适用于fgetc()
, isspace()
,strcmp()
等,我正在尝试更新以使用 ICU。这是我第一次尝试 ICU,并且一直在阅读文档并尝试使用 Google 代码搜索查找使用示例,但仍然存在一些混淆点,我希望有人能够澄清。
该u_fgetc()
函数返回UChar
,并u_fgetcx()
返回UChar32
......文档建议使用u_fgetcx()
来读取代码点,所以这就是我开始的内容。我保持与上面相同的方法,但我将UChar32
s 推入缓冲区而不是char
s。
将字符与已知值进行比较的正确方法是什么?最初我能够
if (c == '+')
检查是否从输入中获取了加号。GCC 不会抱怨什么时候c
是 aUChar32
(然后是和之间的比较UChar32
)char
,但这真的合适吗?我可以用来
strcmp()
将缓冲的字符与已知值进行比较,例如if ((strcmp(buf, "else") == 0)
. ICU提供u_strcmp()
了,我想我可能需要使用U_STRING_DECL
andU_STRING_INIT
宏来指定已知的文字,但我不确定。文档显示它们会导致UChar[]
,尽管我认为我需要UChar32[]
......而且我不确定如何正确使用它们。欢迎在这里提供任何指导。在阅读了一系列数字字符后,我一直在转换它们,
strtol()
以便可以使用它们。自从我现在转换以来,ICU 是否提供了类似的功能UChar32[]
?