gpt4 book ai didi

c - 更新一些扫描器代码以使用 ICU 时的问题

转载 作者:太空狗 更新时间:2023-10-29 14:59:44 27 4
gpt4 key购买 nike

我正在研究一个基本的手工编码词法扫描器,并希望支持 UTF-8 输入(现在已经不是 1970 年了!)。输入字符是从 stdin 或一个文件中读取的,一次一个,然后将其插入缓冲区,直到看到空格,等等。我考虑过为 fgetc() 编写自己的包装器而是返回组成 UTF-8 字符的字节的 char[] 并将结果作为字符串处理……这很容易,但会变得很滑。我宁愿不浪费时间重新发明轮子,而是使用现有的、经过测试的库,如 ICU .所以现在我有一个非 UTF-8 支持代码,可与 fgetc()isspace()strcmp() 等一起使用. 我正在尝试更新以使用 ICU。这是我第一次接触 ICU,一直在通读文档并尝试通过 Google 代码搜索找到使用示例,但仍然存在一些混淆点,我希望有人能够澄清。

u_fgetc()函数返回UCharu_fgetcx()返回UChar32...文档建议使用 u_fgetcx() 来读取代码点,这就是我的起点。我保持与上面相同的方法,但我将 UChar32 插入缓冲区而不是 char

  • 将字符与已知值进行比较的正确方法是什么?最初我能够执行 if (c == '+') 来检查是否从输入中获取了加号。当 cUChar32 时,GCC 不会提示(这是 UChar32char 之间的比较)但是这真的合适吗?

  • 我能够使用 strcmp() 将缓冲字符与已知值进行比较,例如 if ((strcmp(buf, "else") == 0 )。ICU 提供了u_strcmp(),我想我可能需要使用U_STRING_DECLU_STRING_INIT 宏来指定已知的文字,但我不确定。文档显示它们导致 UChar[],但我假设我需要 UChar32[]...而且我不确定如何正确使用它们。欢迎提供任何指导。

  • 读入一系列数字字符后,我一直在使用 strtol() 转换它们,以便我可以使用它们。自从我现在正在转换 UChar32[] 后,ICU 是否提供了类似的功能?

最佳答案

UChar 用于存放一个代码单元,而UChar32 用于存放一个代码点。如果您的输入停留在 Basic Multilingual Plane (BMP),UChar 就足够了,事实上大多数 ICU 功能都在 UChar[] 上运行。

强烈推荐阅读 ICU User Guide ,其中解释了大部分内部结构和最佳实践。

  • 将 Unicode 字符变量与已知值进行比较的正确方法是什么?字符(或 UCharUChar32)只是另一种具有特定宽度和符号的整数类型,可以与其他具有通常注意事项和限制的整数类型进行比较。至于定义一个字符值,C99(第6.4.3章)提供了通用字符名称表示法:\u后跟四个十六进制数字,或者\U 后跟八个十六进制数字,指定 ISO/IEC 10646“短标识符”。 0x00a0 以下的区域(0x0024 '$'、0x0040 '@' 和 0x0060(反引号)除外)被保留(但可以通过转换一个简单的字符常量来表示到 UChar)。还保留了从 0xd800 到 0xdfff 的范围(供 UTF-16 使用)。

  • How to define Unicode string literals? U_STRING_DECLU_STRING_INIT 确实是您要找的。 (如上所述,ICU 主要在 UChar[] 上运行。)如果您使用 C++ 而不是 C,UNICODE_STRING_SIMPLE (可选地后跟 getTerminatedBuffer() 以再次产生 UChar[])提供了一种更舒适的定义 Unicode 字符串文字的方式。

  • 如何将表示数字的 Unicode 字符串转换为该数字的值? unum_parse()及其在 unum.h 中的兄弟会帮助你。

关于c - 更新一些扫描器代码以使用 ICU 时的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com