繁体   English   中英

C ++迭代具有混合长度的字符的utf-8字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM