在C++程序中使用unicode

Ami*_*nos 0 c++ unicode boost

我希望在我的文件同步器应用程序中正确处理带有Unicode字符的字符串,但我不知道这种编码是如何工作的?

在一个unicode字符串中,我可以看到unicode char有这样的形式:"\ uxxxx"其中xs是数字,普通的C或C++程序如何解释这种char?(为什么''后面有一个'你'?效果是什么?)

在互联网上我看到使用"宽字符串或wchar_t ??的例子?那么,什么是处理unicode字符的合适对象?在rapidJson(支持Unicode,UTF-8,UTF-16,UTF-32)中,我们可以使用const char*存储一个可能有"宽字符"的JSOn,但这些字符需要多于一个字节才能表示......我不明白......

这是我目前发现的一种临时安排(unicode-> utf8?ascii?,listFolder是一个std :: string):

boost::replace_all(listFolder, "\\u00e0", "à");
boost::replace_all(listFolder, "\\u00e2", "â");
boost::replace_all(listFolder, "\\u00e4", "ä");
...
Run Code Online (Sandbox Code Playgroud)

Dev*_*lar 5

在C++中处理Unicode字符串的合适对象是icu :: UnicodeString(请参阅侧栏中的"API References,ICU4C"),至少如果你想真正处理 Unicode字符串(而不是仅仅从应用程序的一个点传递它们)到另一个).

wchar_t这是一个处理国际字符集的早期尝试,结果证明这是一个失败,因为wchar_t一旦Unicode扩展到代码点0x10000以后,微软定义为两个字节就不够了.Linux定义wchar_t为四个字节,但不一致使得它(及其派生的std::wstring)对于可移植编程而言毫无用处.

TCHAR是一个Microsoft定义,char默认情况下解析为WCHARif UNICODE,定义为if WCHAR,反过来又wchar_t落后于间接层......是的.

C++ 11给我们带来了char16_tchar32_t以及相应的字符串类,但这些仍是实例basic_string<>,因此有其不足之处试图有一个以上的替换字符大/小写字符时,例如(如德国ß将需要扩展为SS大写;标准库不能这样做).

另一方面,ICU全力以赴.例如,它提供标准化和分解,而标准字符串则不提供.


\uxxxx并且\UXXXXXXXX是unicode角色逃脱.的xxxx是代表UCS-2代码点16位的十六进制数,其等效于一个UTF-16代码点的内基本多语种平面.

XXXXXXXX是一个32位十六进制数,表示UTF-32代码点,可以是任何平面.

如何处理这些字符转义取决于它们出现的上下文(例如,窄/宽字符串),使它们有点不完美.

C++ 11引入了"适当的"Unicode文字:

u8"..."总是一个const char[] 在UTF-8编码.

u"..."总是一个const uchar16_t[] 在UTF-16编码.

U"..."总是一个const uchar32_t[] 在UTF-32编码.

如果使用\uxxxx\UXXXXXXXX在其中一个中使用,则字符文字将始终扩展为正确的代码单元序列.


请注意,将UTF-8存储在a中std::string可能的,但有害.您需要注意很多事情:.length()不是字符串中的字符数..substr()会导致部分和无效的序列..find_first_of()不会按预期工作.等等.

话虽如此,在我看来,UTF-8是任何存储文本唯一合理的编码选择.有些情况需要处理文本作为UTF-16内存(ICU的方式),但在文件中,除了UTF-8之外不接受任何其他内容.它具有节省空间,与字节无关的特性,即使是那些幸福地不知道Unicode问题的软件也可以进行半合理处理(参见上面的警告).