将 UTF-8 文本转换为 wchar_t

Yar*_*man 5 c wchar-t utf-8

我知道这个问题在这里已经被问过很多次了,我确实阅读了一些答案,但是有一些建议的解决方案,我试图找出其中最好的解决方案。

我正在编写一个 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 个字节)。我怎样才能克服它?使用固定大小的字符容器?但是,我应该使用哪些操作函数呢?

很高兴听到一些想法。谢谢。

McD*_*ell 5

C 没有定义charwchar_t类型是什么编码,标准库只强制要求在两者之间转换的一些函数而没有说明如何转换。如果与实现相关的编码char不是 UTF-8,mbstowcs则会导致数据损坏。

正如C99 标准的基本原理所述

然而,这五个功能往往过于严格和原始,无法开发管理字符的可移植国际程序。

...

C90 故意选择不发明更完整的多字节和宽字符库,而是选择等待它们的自然发展,因为 C 社区在宽字符方面获得了更多经验。

来自这里

因此,如果您的chars 中有UTF-8 数据,则没有标准的 API 方法将其转换为wchar_ts。

在我看来,wchar_t除非必要,否则通常应该避免使用 - 例如,如果您使用的是 WIN32 API,则可能需要它。我不相信它会简化字符串操作。wchar_t在 Windows 上始终是 UTF-16LE,因此wchar_t无论如何您可能仍然需要多个来表示单个 Unicode 代码点。

我建议你调查ICU 项目——至少从教育的角度来看。