6

如果我理解得很好,可以同时使用 string 和 wstring 来存储 UTF-8 文本。

  • 对于 char,ASCII 字符占一个字节,一些汉字占 3 或 4,等等。这意味着str[3]不一定指向第 4 个字符。

  • 同样的事情,但每个字符使用wchar_t的最小字节数始终为 2 (而不是 1 char),并且 3 或 4 字节宽的字符将占用 2 wchar_t

正确的 ?

那么,如果我想使用string::find_first_of()orstring::compare()等​​处理这种奇怪的编码字符串怎么办?它会起作用吗?字符串类是否处理字符具有可变大小的事实?或者我应该只将它们用作无特征的虚拟字节数组,在这种情况下,我宁愿使用wchar_t[]缓冲区。

如果std::string不处理,第二个问题:是否有库提供可以处理 UTF-8 编码的字符串类,以便str[3]实际指向第三个字符(这将是长度为 1 到 4 的字节数组)?

4

3 回答 3

5

你在谈论Unicode。Unicode 使用 32 位来表示一个字符。然而,由于这是浪费内存,所以有更紧凑的编码。UTF-8 就是这样一种编码。它假定您使用的是字节单位,并将 Unicode 字符映射到 1、2、3 或 4 个字节。UTF-16 是另一种使用单词作为单位并将 Unicode 字符映射到 1 或 2 个单词(2 或 4 个字节)的方法。您可以将两种编码与字符串和 wchar_t 一起使用。对于英文文本/数字,UTF-8 往往更紧凑。

无论使用何种编码和类型(比较),有些事情都会起作用。然而,所有需要理解一个字符的功能都将被破坏。即第 5 个字符并不总是底层数组中的第 5 个条目。它可能看起来像是在使用某些示例,但它最终会崩溃。string::compare 会起作用,但不要指望按字母顺序排列。那是依赖于语言的。string::find_first_of 将适用于某些但不是全部。长字符串可能会因为它们很长而起作用,而较短的字符串可能会被字符对齐混淆并产生很难找到的错误。

最好的办法是找到一个为您处理它的库并忽略下面的类型(除非您有充分的理由选择其中一个)。

于 2013-09-07T09:50:08.057 回答
2

您无法使用 std::string 或标准库中的任何其他工具处理 Unicode。使用外部库,例如:http ://utfcpp.sourceforge.net/

于 2013-09-07T09:56:21.743 回答
-2

您对那些是正确的:
...这意味着 str[3] 不一定指向第 4 个字符...仅将它们用作无特征的虚拟字节数组...

C++ 字符串只能处理 ascii 字符。这与 Java 的 String 不同,后者可以处理 Unicode 字符。可以将汉字的编码结果(字节)存入字符串(C/C++中的char就是字节),但这没有意义,因为字符串只是把字节当作ascii字符,所以不能用字符串函数来处理。
wstring 可能是您需要的东西。

有一点需要澄清。UTF-8 只是 Unicode 字符的一种编码方法(将字符从/转换为字节格式)。

于 2013-09-07T09:53:29.140 回答