我知道这个问题在这里已经被问过很多次了,我确实阅读了一些答案,但是有一些建议的解决方案,我试图找出其中最好的解决方案。
我正在编写一个 C99 应用程序,它基本上接收以 UTF-8 编码的 XML 文本。
它的部分工作是复制和操作该字符串(查找 substr,cat it,例如..)
因为我现在不想使用外部的非标准库,所以我尝试使用 wchar_t 来实现它。
目前,我使用 mbstowcs 将其转换为 wchar_t 以便于操作,对于一些我尝试使用不同语言的输入 - 它工作正常。
事实是,我确实读过一些人对 UTF-8 和 mbstowcs 有一些问题,所以我想知道这种使用是否被允许/可接受。
我面临的另一个选择是使用带有 WCHAR_T 参数的 iconv。事实是,我在一个平台(而不是 PC)上工作,它的语言环境非常仅限于 ANSI C 语言环境。那个怎么样?
我也遇到过一些非常流行的 C++ 库。但我仅限于 C99 实现。
此外,我将在另一个平台上编译此代码,wchar_t 的 sizeof 是不同的(在我的机器上是 2 个字节与 4 个字节)。我怎样才能克服它?使用固定大小的字符容器?但是,我应该使用哪些操作函数呢?
很高兴听到一些想法。谢谢。
C 没有定义char和wchar_t类型是什么编码,标准库只强制要求在两者之间转换的一些函数而没有说明如何转换。如果与实现相关的编码char不是 UTF-8,mbstowcs则会导致数据损坏。
然而,这五个功能往往过于严格和原始,无法开发管理字符的可移植国际程序。
...
C90 故意选择不发明更完整的多字节和宽字符库,而是选择等待它们的自然发展,因为 C 社区在宽字符方面获得了更多经验。
来自这里。
因此,如果您的chars 中有UTF-8 数据,则没有标准的 API 方法将其转换为wchar_ts。
在我看来,wchar_t除非必要,否则通常应该避免使用 - 例如,如果您使用的是 WIN32 API,则可能需要它。我不相信它会简化字符串操作。wchar_t在 Windows 上始终是 UTF-16LE,因此wchar_t无论如何您可能仍然需要多个来表示单个 Unicode 代码点。
我建议你调查ICU 项目——至少从教育的角度来看。