如何实现跨平台的C++亚洲字符

How to implement C++ asian characters for cross platform?

本文关键字:C++ 字符 跨平台 何实现 实现      更新时间:2023-10-16

我想在C++中实现一些日语字符串处理(我的系统是OSX(。这似乎比听起来困难得多。我读了很多书,但基本的东西还是有问题。

我希望我的代码也能在其他机器上编译和运行。根据我目前所读到的内容,这似乎排除了wchar_t data type

  • 那么,我应该在哪个datatype中表示我的日语字符
  • 如果我使用char,我会得到一个错误,即数据不适合char-data type。那么我应该使用其他什么数据类型
  • 有没有任何可以接受的方法可以用standard c++处理wide-char语言而不存在陷阱,或者如果我坚持标准的c++,我会一直创建一段依赖于系统的代码

为什么不使用wchar_twstring?是的,在某些平台上是4字节,在其他平台上是2字节;尽管如此,它的优点是围绕它构建了一堆字符串处理RTL例程。Cocoa的NSString/CFString是每个字符2个字节(就像Windows上的wchar_t一样(,但它非常不可移植。

您必须小心持久性和有线格式,确保它们不依赖于wchar_t的大小。

实际上,这取决于您的优化优先级。如果您有密集的处理(解析等(,请使用wchar_t。如果您希望与主机系统顺利交互,请选择与主机操作系统假设相匹配的任何格式。

wchar_t重新定义为两个字节也是一种选择。它是带有GCC的-fshort-wchar。您将丢失wcs*RTL的整个主体和STL的大部分,但在与主机系统交互时,代码页翻译会更少。这使得两个知名的移动平台(一个以水果为主题,一个以机器人为主题(碰巧都有两个字节的字符串作为其原生格式,但默认情况下是4字节的wchar_t。-fshort-wchar对两者都有效,我试过了。

以下是桌面和移动平台的方便摘要:

  • Windows、Windows Phone、Windows RT、Windows CE:wchar_t为2字节,操作系统使用UTF-16
  • 香草桌面Linux:wchar_t是4字节,操作系统使用UTF-8,各种框架可能使用谁知道什么(特别是Qt使用UTF-16(
  • MacOS X,iOS:wchar_t是4字节,操作系统使用UTF-16,userland附带了一个替代的基于2字节的字符串RTL
  • Android:wchar_t是4字节,操作系统使用UTF-8,但与Java的交互层使用UTF-16
  • 三星bada:wchar_t是2字节,用户区API使用UTF-16,POSIX层无论如何都严重瘫痪,谁在乎呢
  • 那么我应该用哪种数据类型来表示我的日语字符呢

你应该使用的表示取决于你想做什么。有char32_t可以容纳整个代码点,但这并不一定能解决你的问题。

  • 如果我使用char,我会得到一个错误,即数据不适合char数据类型。那么我应该使用其他什么数据类型

您绝对可以使用正确的编码将日语数据存储在char中。例如,UTF-8非常常见,是OS X上的默认值。以下代码适用于带有clang的OS X和带有gcc的linux。如果输出被重定向到文本文件(并使用一些技巧从VC++中挤出UTF-8字符串文字(,它也适用于Windows。

#include <iostream>
int main() {
  std::cout << "キティ・ホワイトn";
}

其他可能性包括16位整型(UTF-16和UCS-2编码(、32位整型(UCS-4/UTF-32(、用于在系统中保存完整"字符"的自定义类型(使用动态分配或对组合码点的限制,或其他方案(。

  • 有没有任何可以接受的方法可以用标准c++处理宽字符语言而不存在陷阱?或者如果我坚持使用标准c++,我会一直创建一段依赖于系统的代码吗

无论这种未指明的"处理"是什么,如果它可以在任何地方完成,那么就有一种方法可以在标准的、可移植的c++中完成。根据您的需要,您可能希望使用像ICU这样的库,您选择的库可能会指示您对文本使用的表示形式。例如,ICU可以适应不同的编码,但我相信它本身就是UTF-16。