• C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码


    数据库编码为utf8,但是由于某些表的一些字段存储了emoji字符,表采用了utf8mb4编码,默认情况下在C++代码中读出的中文字段值都变成了乱码。

    解决方法为,在进行数据库查询前,在C++中执行一下“set names utf8”,例如在我的程序里执行下面的语句即可:

    //不加这句话,中文乱码
    mDS->executeNonQuery("set names utf8");

    读出数据后,将字符转为本地编码即可,如GB2312,下面的函数实现将utf8编码的字符转为gbk编码: 

    //UTF_8 转gb2312
    void  UTF_8ToGB2312(string &pOut, char *pText, int pLen)
    {
        char buf[4];
        char* rst = new char[pLen + (pLen >> 2) + 2];
        memset(buf,0,4);
        memset(rst,0,pLen + (pLen >> 2) + 2);
    
        int i =0;
        int j = 0;
         
        while(i < pLen)
        {
            if(*(pText + i) >= 0)
            {
               
                rst[j++] = pText[i++];
            }
            else                
            {
                WCHAR Wtemp;
    
               
                UTF_8ToUnicode(&Wtemp,pText + i);
                 
                UnicodeToGB2312(buf,Wtemp);
               
                unsigned short int tmp = 0;
                tmp = rst[j] = buf[0];
                tmp = rst[j+1] = buf[1];
                tmp = rst[j+2] = buf[2];
    
                //newBuf[j] = Ctemp[0];
                //newBuf[j + 1] = Ctemp[1];
    
                i += 3;   
                j += 2;  
            }
           
        }
        rst[j]='';
        pOut = rst;
        delete []rst;
    }
    void UnicodeToGB2312(char* pOut,WCHAR uData)
    {
        WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);
        return;
    }
    void UTF_8ToUnicode(WCHAR* pOut,char *pText)
    {
        char* uchar = (char *)pOut;
        
        uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
        uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);
    
        return;
    }

    读出数据后,要使用GDAL将数据写出到shp文件,同样也遇到了中文乱码问题。参照此处的文章,顺利解决,感谢原作者的分享。

  • 相关阅读:
    [洛谷P3360]偷天换日
    [BZOJ3195]奇怪的道路
    [BAOJ3631]松鼠的新家
    [BZOJ4899]记忆的轮廓
    [BZOJ3940]Censoring
    P3303 [SDOI2013]淘金
    2019.8.5 NOIP模拟测试13 反思总结【已更新完毕】
    2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】
    2019.8.1 NOIP模拟测试11 反思总结
    洛谷P2178 [NOI2015]品酒大会
  • 原文地址:https://www.cnblogs.com/yeahgis/p/5422469.html
Copyright © 2020-2023  润新知