首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++迭代具有混合字符长度的utf-8字符串

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

Stack Overflow用户
提问于 2016-10-15 03:46:54
回答 1查看 4.9K关注 0票数 7

我需要循环一个utf-8字符串,并得到字符串的每个字符。字符串中可能有不同类型的字符,例如长度为一个字节的数字、长度为三个字节的汉字等等。

我看了这个帖子,它可以完成80%的工作,除了当字符串在1字节数字之前有3字节的汉字时,它会看到数字也有3字节,并将数字打印为1**,其中*是胡言乱语。

举个例子,如果字符串是'今天周五123',结果将是:

1**

2**

3**

在那里*是胡言乱语。然而,如果字符串是'123今天周五',数字将打印罚款。

上面提到的帖子中的经过最少修改的代码在这里复制:

代码语言:javascript
代码运行次数:0
运行
复制
#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编码的问题,所以应该有一种方法.已经挣扎了两天了..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-15 04:01:27

插入

代码语言:javascript
代码运行次数:0
运行
复制
memset(symbol, 0, sizeof(symbol));

在此之前

代码语言:javascript
代码运行次数:0
运行
复制
utf8::append(code, symbol);  

如果由于某种原因这仍然无法工作,或者如果您想摆脱库,那么识别代码点并不是那么复杂:

代码语言:javascript
代码运行次数:0
运行
复制
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符号。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40054732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档