c++ 11 utf8 subst…

改编自:http://www.zedwood.com/article/cpp-utf-8-mb_substr-function
这个也有问题,我基础这个改了个完善的另外写了个文字个数统计


uint64_t pinyin::utf8_len(const std::string &str) {
    uint64_t i = 0;
    uint64_t count = 0;
    uint64_t c;

    for (i = 0; i < str.length(); i++) {
        count++;

        c = (unsigned char) str[i];
        if (c >= 0 && c <= 127) i += 0;
        else if ((c & 0xE0) == 0xC0) i += 1;
        else if ((c & 0xF0) == 0xE0) i += 2;
        else if ((c & 0xF8) == 0xF0) i += 3;
            //else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8
            //else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8
        else return 0;//invalid utf8
    }
    return count;
}

std::string pinyin::utf8_substr(const std::string &str, uint64_t start, uint64_t leng) {
    if (leng == 0) { return ""; }
    uint64_t c, i, ix, q, min = std::string::npos, max = std::string::npos;
    for (q = 0, i = 0, ix = str.length(); i < ix; i++, q++) {
        if (q == start) { min = i; }
        if (q <= start + leng || leng == std::string::npos) { max = i; }

        c = (unsigned char) str[i];
        if (c >= 0 && c <= 127) i += 0;
        else if ((c & 0xE0) == 0xC0) i += 1;
        else if ((c & 0xF0) == 0xE0) i += 2;
        else if ((c & 0xF8) == 0xF0) i += 3;
            //else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8
            //else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8
        else return "";//invalid utf8
    }
    if (q <= start + leng || leng == std::string::npos) { max = i; }
    if (min == std::string::npos || max == std::string::npos) { return ""; }
    return str.substr(min, max - min);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值