C ++:包含多种语言的字符串

时间:2013-12-02 02:29:31

标签: c++ unicode internationalization utf

这是我第一次尝试在程序中处理多种语言。如果有人能为我提供一些学习材料以及如何处理这类问题,我将非常感激。

问题是表示具有多种语言的字符串。例如,想一下在许多语言中都有“Hello”的字符串,所有字母都以逗号分隔。我想要做的是分开这些词。所以我的问题是:

  1. 我可以使用std :: string,还是应该使用std :: wstring?
  2. 如果我想对字符串中的每个单词进行标记并将它们放入char *中,我应该使用wchar吗?但是一些编码,比如UTF,可能比wchar可以支持的更大。
  3. 总体而言,处理此类案件的“可接受”方式是什么?
  4. 谢谢。

1 个答案:

答案 0 :(得分:2)

  

我可以使用std::string,还是应该使用std::wstring

两者都可以使用。如果您使用std::string,编码应为UTF-8,以避免使用UTF-16,UCS-2等时获得的空字节。如果您使用std::wstring ,您也可以使用需要较大数字的编码来表示单个字符,即UCS-2和UCS-4通常会很好,但严格来说这是依赖于实现的。在C ++ 11中,还有std::u16string(适用于UTF-16和UCS-2)和std::u32string(适用于UCS-4)。

因此,使用哪种类型取决于您喜欢的编码,而不是您想要表示的语言的数量或类型。

根据经验,UTF-8非常适合存储大型文本,而UCS-4最适合内存占用无关紧要,但您希望字符级迭代和位置算法方便,快速。 (例如:在UTF-8字符串中跳过n个字符是O(n)操作,而在UCS-4中是O(1)操作。)

  

如果我想对字符串中的每个单词进行标记并将它们放入char *中,我应该使用wchar吗?但是一些编码,比如UTF,可能比wchar可以支持的更大。

我会使用与文本本身相同的数据类型。即std::string文字的字词也应为std::stringstd::wstring的字词应为std::wstring

(如果有一个很好的理由从字符串数据类型切换到字符指针数据类型,当然char*适合std::stringwchar_t*适合{ {1}}。类似地,对于C ++ 11类型,有std::stringchar16_t*。)

  

总的来说,处理此类案件的“可接受”方式是什么?

您需要回答的第一个问题是您要用于存储和处理的编码。在高度国际化的环境中,只有Unicode编码才真正符合条件,但仍有不止一种可供选择:UTF-8,UCS-2和UCS-4是最常见的。如上所述,您选择哪一个对内存占用和处理速度有影响,因此请仔细考虑您需要执行哪些类型的操作。可能需要在程序中的某些点将一种编码转换为另一种编码,以获得最佳的空间和时间行为。一旦知道要在程序的每个部分中使用哪种编码,请相应地选择数据类型。

一旦确定了编码和数据类型,您可能还需要查看Unicode规范化。在许多语言中,相同的字符(或字符/变音符号组合)可以由多个Unicode代码点序列表示(尤其是在使用组合字符时)。要正确处理这些情况,您可能需要将Unicode规范化(例如NFKC)应用于字符串。请注意,C ++标准库中没有内置支持。