尽管wchar_t在不同编译器上的支持不一致,但是是否可以安全地假设wchar_t的实现和大小在GNU / GCC中至少在Linux上相似?

尽管wchar_t大小在位大小(32位/ 64位)方面具有系统体系结构依赖性,但Linux上的宽字符类型(GNU / GCC)实际上是编译器依赖性还是libstdc++库依赖性?我的意思是说,通过更改或升级,我应该考虑到wchar_t在大小和支持方面可能无法按预期工作

尽管IBM ICU是另一种选择,但它可以与std::string结合使用吗?

我应该完全弃用wchar_t而不是ICU吗?

注意:在Unix之类的操作系统(例如带有GNU / GCC的Linux)上,libstdc++为编译器带来了核心C++功能,因此有时会进行更新。

最佳答案

如果要向用户显示字符串,则可能必须考虑wchar_t(或其他一些库定义的类型)。不同的编译器和平台对wchar_t的定义不同,因为它们使用不同的Unicode编码技术。例如,在Windows / Visual C++上,wchar_t是16位类型,适用于UTF-16。例如,在GCC / Linux上,wchar_t是32位类型,适用于UTF-32。

IBM ICU库具有用于从一种编码转换为另一种编码的转换功能。您的平台(例如Win32)可能还具有将一种编码转换为另一种编码的功能。

根据您的要求(速度,内存使用情况),您应该选择适合该平台的内部格式。在Windows上可能是UTF-16,在Linux上可能是UTF-32。这样,您就不必一直对字符串进行转码,只需对它们进行简单的平台定义的操作(wcslen()wcscmp()等)。

对于外部格式(文本文件等),我倾向于使用UTF-8。原因是如果文件包含西方语言的文本,则文件会小得多。另一个好处是,您不必考虑UTF-8的固有性,这减少了(您或他人)出错的可能性。

IBM ICU是一个非常强大的库,用于处理Unicode字符串。虽然,它可能使用大铁锤打入小钉子。您需要其所有功能吗?目标平台支持的Unicode功能可能满足您的要求。

关于c++ - wchar_t与C++中ICU的Unicode不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4507222/

10-12 15:03
查看更多