GCC下的2字节(UCS-2)宽字符串 当我将VisualC++项目移植到GCC时,我发现默认情况下WCHARIGT数据类型是4字节UTF32。我可以用一个编译器选项覆盖它,但是RTL的整个wcs*(wcslen、wcscmp等)部分将变得不可用,因为它假定为4字节宽的字符串

GCC下的2字节(UCS-2)宽字符串 当我将VisualC++项目移植到GCC时,我发现默认情况下WCHARIGT数据类型是4字节UTF32。我可以用一个编译器选项覆盖它,但是RTL的整个wcs*(wcslen、wcscmp等)部分将变得不可用,因为它假定为4字节宽的字符串,c++,gcc,right-to-left,widestring,ucs2,C++,Gcc,Right To Left,Widestring,Ucs2,现在,我从头开始重新实现了其中的5-6个函数,并在中定义了我的实现。但是有没有更优雅的选择呢?比如说,一个2字节wchar-t静静地坐在某处等待链接的GCC RTL构建 我所追求的GCC的具体风格是Mac OS X上的Xcode、Cygwin和Debian Linux Etch附带的一款。它是一个带有UTF-16 API的可移植库。正如您所注意到的,wchar\u t是实现定义的。无法使用该数据类型进行可移植工作 在整个UCS-2崩溃被宣布为一个不太好的想法之后,Linux系统通常具有获得Uni

现在,我从头开始重新实现了其中的5-6个函数,并在中定义了我的实现。但是有没有更优雅的选择呢?比如说,一个2字节wchar-t静静地坐在某处等待链接的GCC RTL构建


我所追求的GCC的具体风格是Mac OS X上的Xcode、Cygwin和Debian Linux Etch附带的一款。它是一个带有UTF-16 API的可移植库。

正如您所注意到的,wchar\u t是实现定义的。无法使用该数据类型进行可移植工作

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

您最好使用一个为您管理此功能的库:Qt、ICU等

请注意,cygwin具有一个2字节的wchar\u t,以使与窗口的啮合更容易

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

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

也就是说,Linux平台ABI指定
wchar\u t
的宽度为32位,因此您必须使用一个全新的库(ICU是一个流行的选择),或者移植代码来处理4字节
wchar\u t
s。您可能链接到的所有库也将采用4字节的
wchar\u t
,如果您使用GCC的
-fshort wchar
,这些库将中断


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

重新实现了5-6个更常见的wcs*函数,在中定义了我的实现。

重写所有MSVC宽字符串代码不是我想要的,抱歉。我希望源代码和UCS-2RTL兼容。耸耸肩我的雇主出售这样一个库。我有理由相信ICU是最接近的免费选择。我的观点是正确的。为了记录在案,UTF-8中任何非平凡的字符串处理都会吸塑料袋。迭代到字符串中的第i个字符(不是字节)是一个O(i)操作,哦,天哪。但这是现在几乎所有Linux系统上配置的语言环境,所以这是您必须处理的问题。@Steva:UTF-16也有同样的问题。不要混淆UCS-2(Win2k之前版本)和UTF-16(Win2k+)。我使用的字符在设计上仅限于基本的多语言平面。所以,出于实际目的,这都是UCS-2。此外,谁说过Linux?我第一次在Mac上遇到这种情况,在Mac上,unsigned short(又名“unichar”)是操作系统级的本机字符格式,就像在Win32中一样。