string转utf8后解决TTS识别中文的问题

来源:互联网 发布:淘宝 旧版本 ipad 编辑:程序博客网 时间:2024/05/16 08:47

今天遇到string字符编码的问题,因为遇到了用TTS将文本转语音的一个API,里面的中文必须是utf8的,我传了一个uncode编码的中文进去,就一直不能正常读出来,后来才发现是编码的问题。这里在网上找到两个API,可将string 传成utf8编码的string,挺好用的。

记录下来:


std::string string_To_UTF8(const std::string & str){    int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);    wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴    ZeroMemory(pwBuf, nwLen * 2 + 2);    ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);    int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);    char * pBuf = new char[nLen + 1];    ZeroMemory(pBuf, nLen + 1);    ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);    std::string retStr(pBuf);    delete []pwBuf;    delete []pBuf;    pwBuf = NULL;    pBuf  = NULL;    return retStr;}BOOL IsTextUTF8(char* str,ULONGLONG length){    DWORD nBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节    UCHAR chr;    BOOL bAllAscii=TRUE; //如果全部都是ASCII, 说明不是UTF-8    for(int i=0; i<length; ++i)    {        chr= *(str+i);        if( (chr&0x80) != 0 ) // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx            bAllAscii= FALSE;        if(nBytes==0) //如果不是ASCII码,应该是多字节符,计算字节数        {            if(chr>=0x80)            {                if(chr>=0xFC&&chr<=0xFD)                    nBytes=6;                else if(chr>=0xF8)                    nBytes=5;                else if(chr>=0xF0)                    nBytes=4;                else if(chr>=0xE0)                    nBytes=3;                else if(chr>=0xC0)                    nBytes=2;                else                    return FALSE;                nBytes--;            }        }        else //多字节符的非首字节,应为 10xxxxxx        {            if( (chr&0xC0) != 0x80 )                return FALSE;            nBytes--;        }    }    if( nBytes > 0 ) //违返规则        return FALSE;    if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8        return FALSE;    return TRUE;}

2 0
原创粉丝点击