繁体   English   中英

强制wchar_t为4个字节

[英]compelling wchar_t to be 4 bytes

实际问题-我正在研究一个可以在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等)提供的宽字符操作功能。

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

我尝试使用ICU,但这是一个非常大的库,因此无法达成协议。 我需要它小巧可靠。

谢谢

这是用于字符串操作的选项:

  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()返回字节而不是字符数。 但是,实际上很少需要按字符位置索引字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM