std::string 和 UTF-8 编码的 unicode

std::string and UTF-8 encoded unicode

本文关键字:unicode 编码 string std UTF-8      更新时间:2023-10-16

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

    对于字符,
  • ASCII 字符占用单个字节,一些中文字符占用 3 或 4,依此类推。这意味着str[3]不一定指向第 4 个字符。

  • 同样的事情wchar_t但每个字符使用的最小字节量始终为 2(而不是 1 表示 char ),而 3 或 4 字节宽的字符将需要 2 wchar_t .

右?

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

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

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

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

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

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

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

C++字符串只能处理 ASCII 字符。这与 Java 字符串不同,后者可以处理 Unicode 字符。您可以将中文字符的编码结果(字节)存储为字符串(C/C++中的char只是字节),但这毫无意义,因为字符串只是将字节视为ascii字符,因此无法使用字符串函数进行处理。
wstring可能是你需要的东西。

有些事情应该澄清。UTF-8 只是 Unicode 字符的一种编码方法(将字符从/转换为字节格式)。