c++ - 在 C++ 中处理北欧字符的字符串很困难
问题描述
我尝试了很多方法来解决这个问题。我只想分割一个字符串或对每个字符做一些事情。一旦字符串中有北欧字符,就不可能分割该字符串。
length()
如果我们查看内存使用情况,该函数会返回正确的答案,但这与字符串长度不同。"ABCÆØÅ"
长度不是 6,是 9。每个特殊字符加一个。
谁有好的答案??
这里的测试,显示问题,一些字母和很多?
标记。:-(
int main()
{
string name = "some æøå string";
for_each(name.begin(), name.end(), [] (char c) {
cout << c;
cout << endl;
});
}
解决方案
如果您的终端支持 utf-8 编码,那么在您输入的字符串中使用 std::cout 应该没有问题,但是,您需要告诉编译器您输入了一个 utf8 字符串,如下所示:
int main()
{
string name = u8"some æøå string";
for_each(name.begin(), name.end(), [] (char c) {
cout << c;
cout << endl;
});
cout<<name; //this will also work
return 0; //add this just to be tidy
}
您需要这样做,因为 UTF-8 中的字符可能需要 1、2、3 或 4 个字节,具体取决于其表面。
然后根据您需要做什么,例如在字符之间拆分,您应该创建一个函数来检测每个 utf8 字符的长度。然后为每个 utf8 字符创建一个“字符串”,并从原始字符串中提取所需数量的字符。有一个非常好的库(非常紧凑)utf8proc 可以让你做这些事情。
utf8proc在许多项目中帮助我解决了这类问题。
推荐阅读
- sql-server - 如何在将源定义为 Azure SQL Server 的 NSG 中定义入站安全规则
- android - keytool :在我的生产密钥库中写入 SHA256withRSA 而不是实际的 SHA256
- php - 在 GCP 计算引擎 move_uploaded_file() 不工作
- node.js - 节点 JS 服务器地址不可用
- macos - Apple Script:将文件(从提示中选择)复制到另一个位置
- python - 如何将汤中的特定标签转换为字符串?
- raspberry-pi4 - 是否有 Linux 操作系统的智能眼镜
- bots - 如何让机器人控制我的电报个人聊天
- android - 当我添加一个孩子时,监听器多次调用,我不知道为什么..有我的代码
- android - 将 compose 示例项目导入 android studio 4.2 版