GCC下的2字节(UCS-2)宽字符串

时间:2010-05-07 17:28:34

标签: c++ gcc right-to-left widestring ucs2

将Visual C ++项目移植到GCC时,我发现wchar_t数据类型默认为4字节UTF-32。我可以用编译器选项覆盖它,但是RTL的整个wcs *(wcslen,wcscmp等)部分变得无法使用,因为它假设是4字节宽的字符串。

现在,我已经从头开始重新实现了5-6个这些函数,并且#defined我的实现。但是有一个更优雅的选择 - 比如说,一个GCC RTL的构建,2字节的wchar-t静静地坐在某个地方等待联系?

我所追求的GCC的特定风格是Mac OS X上的Xcode,Cygwin以及Debian Linux Etch附带的Xcode。

4 个答案:

答案 0 :(得分:2)

  

但是有没有一个更优雅的选择 - 比如,一个GCC RTL的构建,2字节的wchar-t静静地坐在某个地方,等待链接?

没有。这是一个特定于平台的问题,而不是GCC问题。

也就是说,Linux平台ABI指定wchar_t是32位宽,所以你要么必须使用一个全新的库(ICU是一个受欢迎的选择),要么将你的代码移植到处理4字节wchar_t s。如果您使用GCC的wchar_t,您可能链接到的所有库也将采用4字节-fshort-wchar,并且中断。

但在Linux上,几乎每个人都已经针对所有多字节编码标准化了UTF-8。

答案 1 :(得分:1)

查看ICU library。它是一个带有UTF-16 API的可移植库。

答案 2 :(得分:1)

正如您所注意到的,wchar_t是实现定义的。使用该数据类型无法进行便携式工作。

Linux系统通常具有以后获得Unicode支持的优势,在整个UCS-2崩溃被宣布为不太好的想法之后,并使用UTF-8作为编码。所有系统API仍然在char *上运行,并且是Unicode安全的。

您最好的选择是使用一个管理这个的库:Qt,ICU等。

请注意,cygwin具有2字节的wchar_t,可以更轻松地与Windows进行网格划分。

答案 3 :(得分:0)

重新实现了5-6个更常见的wcs *函数,#undefined my implementation in。