C++ UTF-8字符串处理



  • 首先使用include包含头文件:

    #include <iostream>
    #include <wchar.h>
    #include <locale>
    #include <codecvt>
    
    using namespace std;
    

    wstring转换成utf8编码

    /**
     * 将wstring转换成utf8编码
     * @param [in] text : 待转换的宽字符
     * @return 
     */
    string Utils::wstr2utf8(const wstring &text){
        std::wstring_convert<std::codecvt_utf8<wchar_t>>cnv;
        return cnv.to_bytes(text);
    }
    

    将utf8转换成wstring

    /**
     * 将utf8转换成wstring
     * @param  [in] text : 待转换的utf8字符串
     * @return 
     */
    wstring Utils::utf82wstr(const string &text){
        std::wstring_convert<std::codecvt_utf8<wchar_t>> cnv;
        return cnv.from_bytes(text);
    }
    

    分割UTF-8字符串

    /**
     * 分割UTF-8字符串
     * @param [in] text : 待处理的utf8字符串
     * @param [in] start : 开始位置
     * @param [in] leng : 长度
     * @return 
     */
    std::string Utils::utf8_substr(const std::string& text, uint32_t start, uint32_t leng){
        if (leng==0) { return ""; }
        uint32_t c, i, ix, q, min=string::npos, max=string::npos;
        for (q=0, i=0, ix=text.length(); i < ix; i++, q++){
            if (q==start){ min=i;}                                // 记录下截取的开始下标
            if (q<=start+leng || leng==string::npos){ max=i;}     // leng == -1 代表截取到末尾 所以每次max=i即可
            c = (unsigned char) text[i];
            if      (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;
            else if ((c & 0xFE) == 0xFC) i+=5;
            else return "";
        }
        //    printf("min:%d,max:%d,ix:%d,i:%d\n",min,max,ix,i);
        if (q<=start+leng || leng==std::string::npos){ max=i; }
        if (min==std::string::npos || max==std::string::npos) { return ""; }
        return text.substr(min,max-min);
    }
    

    获取UTF-8字符串长度

    /**
     * 获取UTF-8字符串长度
     * @param [in] text : 待处理的utf8字符串
     * @retval 长度
     */
    int Utils::utf8_strlen(const string& text){
        int c,i,ix,q;
        for (q=0, i=0, ix=text.length(); i < ix; i++, q++){
            c = (unsigned char) text[i];
            if      (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;
            else if ((c & 0xFE) == 0xFC) i+=5;
            else return 0;    
        }
        return q;
    }
    

Log in to reply