我知道这个问题在这里被问了很多次,我确实阅读了一些答案,但是有一些建议的解决方案,我正在尝试找出最好的解决方案。
我正在编写一个基本上接收以 UTF-8 编码的 XML 文本的 C99 应用程序。
它的部分工作是复制和操作该字符串(找到一个 substr,cat it,ex..)
因为我现在不想使用外部非标准库,所以我尝试使用 wchar_t 来实现它。
目前,我正在使用 mbstowcs 将其转换为 wchar_t 以便于操作,对于一些输入,我尝试了不同的语言 - 它工作正常。
事情是,我确实读到一些人对 UTF-8 和 mbstowcs 有一些问题,所以我想知道这种使用是否被允许/可接受。
我面临的其他选择是使用带有 WCHAR_T 参数的 iconv。事情是,我在一个平台(不是 PC)上工作,它的语言环境非常非常仅限于 ANSI C 语言环境。那个怎么样?
我也确实遇到了一些非常流行的 C++ 库。但我仅限于 C99 实现。
此外,我会在另一个平台上编译这段代码,wchar_t 的大小不同(我的机器上是 2 字节对 4 字节)。我怎样才能克服呢?使用固定大小的 char 容器?但是,我应该改用哪些操作函数?
很高兴听到一些想法。谢谢。
最佳答案
C 没有定义 char
和 wchar_t
类型是什么编码,标准库只规定了一些在两者之间转换的函数,但没有说明如何转换。如果 char
的实现相关编码不是 UTF-8,则 mbstowcs
将导致数据损坏。
如 the rationale for the C99 standard 中所述:
However, the five functions are often too restrictive and too primitive to develop portable international programs that manage characters.
...
C90 deliberately chose not to invent a more complete multibyte- and wide-character library, choosing instead to await their natural development as the C community acquired more experience with wide characters.
来源 here .
因此,如果您的 char
中有 UTF-8 数据,则没有标准的 API 方法可以将其转换为 wchar_t
。
在我看来,wchar_t
通常应避免使用,除非必要 - 例如,如果您使用 WIN32 API,则可能需要它。我不相信它会简化字符串操作。 wchar_t
在 Windows 上始终是 UTF-16LE,因此无论如何您可能仍然需要多个 wchar_t
来表示单个 Unicode 代码点。
我建议您调查 ICU project - 至少从教育的角度来看。
关于将 UTF-8 文本转换为 wchar_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21120965/