[英]C++ iterate utf-8 string with mixed length of characters
我需要遍历 utf-8 字符串并获取字符串的每个字符。 字符串中可能有不同类型的字符,例如长度为一字节的数字,长度为三字节的汉字等。
我看了这篇文章,它可以完成 80% 的工作,除了当字符串在 1 字节数字之前有 3 字节汉字时,它会看到数字也有 3 个字节,并将数字打印为 1**其中 * 是胡言乱语。
举个例子,如果字符串是“今天周五123”,结果将是:
今天周五
1**
2**
3**
其中 * 是胡言乱语。 但是,如果字符串是“123今天周五”,则数字将正常打印。
上面提到的帖子中经过最少修改的代码复制到这里:
#include <iostream>
#include "utf8.h"
using namespace std;
int main() {
string text = "今天周五123";
char* str = (char*)text.c_str(); // utf-8 string
char* str_i = str; // string iterator
char* end = str+strlen(str)+1; // end iterator
unsigned char symbol[5] = {0,0,0,0,0};
cout << symbol << endl;
do
{
uint32_t code = utf8::next(str_i, end); // get 32 bit code of a utf-8 symbol
if (code == 0)
continue;
cout << "utf 32 code:" << code << endl;
utf8::append(code, symbol); // initialize array `symbol`
cout << symbol << endl;
}
while ( str_i < end );
return 0;
}
有人可以在这里帮助我吗? 我是 C++ 新手,虽然我检查了utf8 cpp的文档,但我仍然不知道问题出在哪里。 我认为创建该库是为了处理具有不同长度的 utf-8 编码的此类问题,因此应该有一种方法可以做到这一点......已经为此苦苦挣扎了两天......
插入
memset(symbol, 0, sizeof(symbol));
之前
utf8::append(code, symbol);
如果由于某种原因这仍然不起作用,或者如果您想摆脱 lib,识别代码点并没有那么复杂:
string text = "今天周五123";
for(size_t i = 0; i < text.length();)
{
int cplen = 1;
if((text[i] & 0xf8) == 0xf0) cplen = 4;
else if((text[i] & 0xf0) == 0xe0) cplen = 3;
else if((text[i] & 0xe0) == 0xc0) cplen = 2;
if((i + cplen) > text.length()) cplen = 1;
cout << text.substr(i, cplen) << endl;
i += cplen;
}
但是,对于这两种解决方案,请注意存在多 cp 字形以及无法单独打印的 cp 字形
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.