如何实现跨平台的C++亚洲字符
How to implement C++ asian characters for cross platform?
我想在C++
中实现一些日语字符串处理(我的系统是OSX
(。这似乎比听起来困难得多。我读了很多书,但基本的东西还是有问题。
我希望我的代码也能在其他机器上编译和运行。根据我目前所读到的内容,这似乎排除了wchar_t data type
。
- 那么,我应该在哪个
datatype
中表示我的日语字符 - 如果我使用char,我会得到一个错误,即数据不适合
char-data type
。那么我应该使用其他什么数据类型 - 有没有任何可以接受的方法可以用
standard c++
处理wide-char
语言而不存在陷阱,或者如果我坚持标准的c++
,我会一直创建一段依赖于系统的代码
为什么不使用wchar_t
和wstring
?是的,在某些平台上是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。
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存