gpt4 book ai didi

c++ - 如何在C++中轻松管理Unicode字符串

转载 作者:行者123 更新时间:2023-12-02 09:55:56 25 4
gpt4 key购买 nike

我想从Unicode字符串中获取每个字符。
如果这个问题不好,希望您能谅解。

string str = "öp";
for (int i = 0; i < str.length(); i++) {
cout << str[i] << endl;
}

在这种情况下,因为 ö的长度为2,str [0]是一个断字符。
我该如何管理?非常感谢您的回答。谢谢。

最佳答案

为了在UTF-8字符串的字符之间插入字符(例如,您在本示例中尝试使用换行符),必须仅在完整的字素簇之间插入字符。现在,您在不完整的代码点之后添加换行符,这会破坏编码。

Unicode标准是here。特别请参阅本节:

3.9 Unicode Encoding Forms

UTF-8

Table 3-6. UTF-8 Bit Distribution

+----------------------------+------------+-------------+------------+-------------+
| Scalar Value | First Byte | Second Byte | Third Byte | Fourth Byte |
+----------------------------+------------+-------------+------------+-------------+
| 00000000 0xxxxxxx | 0xxxxxxx | | | |
| 00000yyy yyxxxxxx | 110yyyyy | 10xxxxxx | | |
| zzzzyyyy yyxxxxxx | 1110zzzz | 10yyyyyy | 10xxxxxx | |
| 000uuuuu zzzzyyyy yyxxxxxx | 11110uuu | 10uuzzzz | 10yyyyyy | 10xxxxxx |
+----------------------------+------------+-------------+------------+-------------+

通过这些,我们可以设计以下算法来迭代代码点:
for (int i = 0; i < str.length();) {
std::cout << str[i];

if(str[i] & 0x80) {
std::cout << str[i + 1];
if(str[i] & 0x20) {
std::cout << str[i + 2];
if(str[i] & 0x10) {
std::cout << str[i + 3];
i += 4;
} else {
i += 3;
}
} else {
i += 2;
}
} else {
i += 1;
}

std::cout << std::endl;
}
如果以组合形式将其标准化,则该简单算法足以满足您的示例要求,即 "ö"是单个代码点。但是,对于一般用法,需要更复杂的算法来区分字素簇。
此外,这种简单的算法不会检查无效序列,并且在这种情况下可能会使输入字符串溢出。这仅是一个简单示例,并不打算用于生产。对于生产用途,我建议使用外部库。

关于c++ - 如何在C++中轻松管理Unicode字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60148790/

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