我需要循环遍历utf-8字符串并获取字符串的每个字符。字符串中可能有不同类型的字符,例如长度为一个字节的数字,长度为三个字节的汉字等。
我查看了这个post并且可以执行80%的工作,除了当字符串在1字节数字之前有3个字节的中文字符时,它会看到数字也有3个字节,将数字打印为1 **,其中*为乱码。
举一个例子,如果字符串是'今天周五123',结果将是:
今
天
周
五
1 **
2 **
3 **
其中*是胡言乱语。但是,如果该字符串是' 123今天周五',这些数字将打印出来。
上面提到的post中经过最低限度修改的代码复制到此处:
#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编码的问题而创建的,所以应该有办法做到这一点......两天都在苦苦挣扎......
答案 0 :(得分:4)
插入
memset(symbol, 0, sizeof(myarray));
之前
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