我正在写一些类似于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的转换,因为这些转换是由相关的RFC / UCS / Unicode标准100%指定的,但要小心:大多数人错误地实现它们并且有危险的错误.
请注意,UTF-8,UTF-16和UTF-32文字(分别为u8,u和U)的新编译器级功能可能很有用;您可以使用您自己的函数以有意义的方式处理结果字符串,而这些方法完全不依赖于语言环境.但在我看来,C11中对Unicode的库级支持基本上没用.