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

时间:2014-03-26 19:24:56

标签: c++ unicode

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

我希望我的代码也可以在其他机器上编译和运行。到目前为止,这似乎排除了wchar_t data type

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

2 个答案:

答案 0 :(得分:3)

为什么不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
  • Vanilla桌面Linux :wchar_t是 4 字节,OS使用UTF-8,各种框架可能会使用谁知道什么(Qt,特别是使用UTF-16)< / LI>
  • MacOS X,iOS :wchar_t 4 字节,操作系统使用UTF-16,userland附带另一个基于2字节的字符串RTL
  • Android :wchar_t是 4 字节,操作系统使用UTF-8,但与Java的交互层使用UTF-16
  • 三星bada :wchar_t是 2 字节,userland API使用UTF-16,POSIX层无论如何都严重残缺,所以谁在乎

答案 1 :(得分:1)

  
      
  • 我应该用哪种数据类型代表我的日文字符?
  •   

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

  
      
  • 如果我使用char,我会收到数据不适合char-data类型的错误。那我应该使用什么其他数据类型?
  •   

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

#include <iostream>

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

其他可能性是16位整数类型(UTF-16和UCS-2编码),32位整数类型(UCS-4 / UTF-32),用于保存完整字符的自定义类型&#39;在您的系统中(使用动态分配或组合代码点或其他方案的限制)。

  
      
  • 有没有可接受的方法来处理带有标准c ++的宽字母语言而没有陷阱,或者如果我坚持使用标准c ++,我是否总是创建一个依赖于系统的代码?
  •   

无论这种未指明的&#39;处理&#39;是的,如果它可以在任何地方完成,那么可以通过标准的便携式c ++来实现。根据您的需要,您可能希望使用类似ICU的库,并且您选择的库可能会指示您对文本使用的表示形式。例如,ICU适应不同的编码,但我认为它本身就是UTF-16。