将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。
答案 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。