C ++使用混合字符长度迭代utf-8字符串

时间:2016-10-15 03:46:54

标签: c++ string utf-8

我需要循环遍历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编码的问题而创建的,所以应该有办法做到这一点......两天都在苦苦挣扎......

1 个答案:

答案 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