迫使wchar_t为4个字节

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

实际问题 - 我正在研究一个在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,但它是一个非常大的库,因此打破了这笔交易.我需要它小而可靠.

谢谢

Die*_*Epp 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.

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

关于索引的说明

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