我正在开发一个基本的手工编码词汇扫描仪,并希望支持UTF-8输入(现在已经不是1970年了!)。输入字符从stdin
或一个文件中读取,一次一个,并被推入缓冲区,直到看到空白,等等。我考虑为fgetc()
编写自己的包装器,它将返回组成UTF-8字符的字节的char[]
,并将结果作为字符串处理。。。这很容易,但会变成一个滑坡。我宁愿不浪费时间重新发明轮子,而是使用一个现有的、经过测试的库,如ICU。因此,现在我有了一个非UTF-8支持的代码,可以与fgetc()
、isspace()
、strcmp()一起使用
等,我正在尝试更新以使用ICU。这是我第一次进入ICU,我一直在阅读文档,并试图通过谷歌代码搜索找到使用示例,但仍有一些困惑,我希望有人能够澄清。
u_fgetc()
函数返回UChar
,u_fgetcx()
返回UChar32
。。。文档建议使用ufgetcx()
来读取代码点,所以这就是我的起点。我保持了与上面相同的方法,但我将UChar32
s推入缓冲区,而不是char
s。
将字符与已知值进行比较的正确方法是什么?最初,我可以执行
if(c=++)
来检查是否从输入中提取了加号。当c
是UChar32
时,GCC不会抱怨(这是UChar32
和char
之间的比较),但这真的合适吗?我能够使用
strcmp()
将缓冲的字符与已知值进行比较,例如if((strcmp,“else”)==0)
。ICU提供了u_strcmp()
,我认为我可能需要使用u_STRING_DECL
和u_STRING_INIT
宏来指定已知的文字,但我不确定。文档显示它们导致了UChar[]
,尽管我认为我需要UChar32[]
在阅读了一系列数字字符后,我一直在用
strtol()
转换它们,这样我就可以使用它们了。由于我现在正在转换UChar32[]
,ICU是否提供了类似的功能?