gpt4 book ai didi

C++:具有多种语言的字符串

转载 作者:太空狗 更新时间:2023-10-29 21:44:20 25 4
gpt4 key购买 nike

这是我第一次尝试在程序中处理多种语言。如果有人可以向我提供一些学习 Material 以及如何处理此类问题,我将不胜感激。

问题是表示一个包含多种语言的字符串。例如,考虑一个字符串,在许多语言中都包含“Hello”,全部以逗号分隔。我要做的是把这些词分开。所以我的问题是:

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

谢谢。

最佳答案

Can I use std::string for this or should I use 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) 操作。)

If I want to tokenize each of the words in the string and put them in to a char*, should I use wchar? But some encodings, such as UTF, can be bigger than what wchar can support.

我会为单词使用与文本本身相同的数据类型。 IE。 std::string 文本的单词也应该是 std::stringstd::wstring 中的单词也应该是 std::wstring.

(如果确实有充分的理由从字符串数据类型切换到字符指针数据类型,当然 char* 适合 std::string wchar_t* 适用于 std::string。同样对于 C++11 类型,有 char16_t*char32_t *.)

Overall, what is the 'accepted' way of handling this type of case?

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

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

关于C++:具有多种语言的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20319919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com