我需要循环一个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编码的问题,所以应该有一种方法.已经挣扎了两天了..。
发布于 2016-10-14 20:01:27
插入
memset(symbol, 0, sizeof(symbol));
在此之前
utf8::append(code, symbol);
如果由于某种原因这仍然无法工作,或者如果您想摆脱库,那么识别代码点并不是那么复杂:
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符号。
https://stackoverflow.com/questions/40054732
复制相似问题