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,但它是一个非常大的库,因此打破了这笔交易.我需要它小而可靠.
谢谢
以下是字符串操作的选项:
使用unsigned char(或char)和UTF-8.所有的常规字符串处理函数的工作(如strlen(),strstr(),snprintf(),等).
wchar_t在不同平台上使用和使用不同的编码(Win32使用UTF-16,OS X和Linux使用UTF-32).这是一条疯狂的道路,因为你必须在同一代码库中支持两种不同的编码.
使用UTF-32或UTF-16以及您自己的字符串操作函数.这是很多工作,但它是便携式的.
使用ICU和UTF-16.
在大多数情况下,以UTF-8操作字符串非常有效.这取决于你的程序做什么.如果您正在进行解析和模板化操作,UTF-8很容易使用.如果您需要更复杂的功能,例如迭代断点或查找字形集群边界,那么您将需要一个像Glib(使用UTF-8)或ICU(使用UTF-16)的库.
您可能习惯使用字符/代码点索引索引字符串.习惯使用代码单元索引索引字符串:因此strlen()返回字节数,而不是字符数. 但是,实际上需要按字符位置索引字符串是非常罕见的.