首先使用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;
}