我正在编写一些类似于atoi()
或strtoll()
的字符串转换函数。我想包含一个可以接受 char16_t* 或 char32_t* 而不仅仅是 char* 或 wchar_t* 的函数版本。
我的函数工作正常,但在编写它时我意识到我不明白 char16_t 或 char32_t 是什么。我知道标准只要求它们分别是至少 16 位或 32 位的整数类型,但暗示它们是 UTF-16 或 UTF-32。
我也知道该标准定义了几个函数,但它们不包含任何 *get 或 *put 函数(就像它们在 C99 中添加到 wchar.h
时那样)。
所以我想知道:他们希望我用 char16_t 和 char32_t 做什么?
最佳答案
这是个好问题,没有明显的答案。
C11 中添加的uchar.h
类型和函数基本上没有用。它们只支持新类型(char16_t
或 char32_t
)和区域特定的、实现定义的多字节编码之间的转换,除非区域设置基于UTF-8。不支持有用的转换(到/从 wchar_t
和到/从 UTF-8)。当然,您可以自己进行与 UTF-8 的转换,因为这些转换 100% 由相关的 RFC/UCS/Unicode 标准指定,但要小心:大多数人实现错误并存在危险的错误。
请注意,针对 UTF-8、UTF-16 和 UTF-32 文字的新编译器级功能(u8
、u
, 和 U
,分别)可能有用;您可以以完全不依赖于区域设置的有意义的方式使用您自己的函数处理结果字符串。但在我看来,C11 中对 Unicode 的库级支持基本上是无用的。
关于C11 Unicode 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26106647/