使用 C++11,我还需要用于 Unicode 文本的非标准字符串操作库吗?

2024-03-14

我注意到 std::string 的 length 方法返回以字节为单位的长度,而 std::u16string 中的相同方法返回 2 字节序列的数量。

我还注意到,当字符或代码点位于 BMP 之外时,长度返回 4 而不是 2。

此外,Unicode 转义序列仅限于 \unnnn,因此 U+FFFF 之上的任何代码点都不能由转义序列插入。

换句话说,似乎不支持 BMP 之外的代理对或代码点。

鉴于此,是否接受或推荐使用理解 UTF-8、UTF-16、代理项对等的非标准字符串操作库?

我的编译器是否存在错误,或者我是否错误地使用了标准字符串操作方法?

Example:

/*
* Example with the Unicode code points U+0041, U+4061, U+10196 and U+10197
*/

#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
    std::string example1 = u8"A䁡????????";
    std::u16string example2 = u"A䁡????????";

    std::cout << "Escape Example: " << "\u0041\u4061\u10196\u10197" << "\n";
    std::cout << "Example: " << example1 << "\n";
    std::cout << "std::string Example length: " << example1.length() << "\n";
    std::cout << "std::u16string Example length: " << example2.length() << "\n";

    return 0;
}

这是我用 GCC 4.7 编译时得到的结果:

Escape Example: A䁡မ6မ7
Example: A䁡????????
std::string Example length: 12
std::u16string Example length: 6

std::basic_string是面向代码单元的,而不是面向字符的。如果您需要处理代码点,您可以转换为 char32_t,但标准中还没有提供更高级的 Unicode 功能。

您也可以使用\UNNNNNNNN除了直接输入非 BMP 代码点的转义序列之外(假设您使用的是支持它们的源编码)。

根据您的需要,这可能是您需要的全部 Unicode 支持。许多软件只需要对字符串进行基本操作,例如可以直接在代码单元上轻松完成的操作。对于稍高级别的需求,您可以将代码单元转换为代码点并对其进行处理。对于更高级别的需求,例如处理字素簇,将需要额外的支持。

我想说这意味着标准中有足够的支持来表示 Unicode 数据和执行基本操作。无论用于更高级别功能的第三方库都应该构建在标准库的基础上。随着时间的推移,该标准也可能包含更多更高级别的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C++11,我还需要用于 Unicode 文本的非标准字符串操作库吗? 的相关文章

随机推荐