迫使wchar_t为4个字节

时间:2014-01-16 18:41:41

标签: c utf-8 utf wchar-t

实际问题 - 我正在开发一个在2个独立硬件平台上运行的应用程序。

编译方法及其配置由我定义和控制。

我的应用程序收到UTF-8 / ISO-8859文本,并应对字符串执行一些基本操作(复制,搜索等)。

事情是,一个编译器是GCC(sizeof(wchar_t)== 4),另一个是Mingw(sizeof(wchar_t)== 2)。

为了支持所有UTF-8的可能性,我在我的代码中考虑wchar_t中的“typedef”为uint32_t类型,因此这将迫使Mingw编译器在同一行上,并覆盖所有UTF- 8个选项。

然后我计划使用标准库提供的宽字符操作函数(mbstowcs,wcscmp,wcscpy,ex ..)

问题是,“强迫”编译器使用更多空间,可能会对库函数产生一些不良影响(除了性能)(更改后mbtowcs会在这里工作吗?)

我尝试使用ICU,但它是一个非常大的库,因此打破了这笔交易。我需要它小而可靠。

由于

1 个答案:

答案 0 :(得分:5)

以下是字符串操作的选项:

  1. 使用unsigned char(或char)和UTF-8。所有常规字符串操作函数都有效(例如strlen()strstr()snprintf()等。)

  2. 使用wchar_t并在不同平台上使用不同的编码(Win32使用UTF-16,OS X和Linux使用UTF-32)。这是一条疯狂的道路,因为你必须在同一个代码库中支持两种不同的编码。

  3. 使用UTF-32或UTF-16以及您自己的字符串操作函数。这是很多工作,但它是便携式的。

  4. 使用ICU和UTF-16。

  5. 对于大多数用途,在UTF-8中操作字符串非常有效。这取决于你的程序做什么。如果您正在进行解析和模板化操作,UTF-8很容易使用。如果您需要更复杂的功能,例如迭代断点或查找字形簇边界,那么您将需要一个像Glib(使用UTF-8)或ICU(使用UTF-16)的库。

    关于索引的说明

    您可能习惯使用字符/代码点索引索引字符串。习惯使用代码单元索引索引字符串:所以strlen()返回字节的数量,而不是字符的数量。然而,它实际上非常罕见需要按字符位置索引字符串。