将 UTF-8 文本转换为 wchar_t

标签 c utf-8 wchar-t

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

我正在编写一个基本上接收以 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 没有定义 charwchar_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/

相关文章:

c++ - 使用 AMD 显卡的 Eclipse-CDT (Windows) 中的 OpenCL

c++ - typedef struct name 没有后续结构定义的名称

java utf-8编码字符串中奇数个字符的字节变化

python-3.x - 非英语语料的词云

c++ - 使用 wmemset 初始化 wchar_t 数组。编码重要吗?

c - 尝试在 makefile 中复制 2 个依赖项

无法在 linux 和 windows 中编译 pgbouncer

c - 传递给函数的 wchar_t 数组

windows - 检查 UTF8 编码字符串的有效性

c++ - 比较两个宽字符串 Visual C++