C++讀取mysql中utf8mb4編碼表數據亂碼問題及UTF8轉GBK編碼

數據庫編碼爲utf8,可是因爲某些表的一些字段存儲了emoji字符,表採用了utf8mb4編碼,默認狀況下在C++代碼中讀出的中文字段值都變成了亂碼。數據庫

解決方法爲,在進行數據庫查詢前,在C++中執行一下「set names utf8」,例如在個人程序裏執行下面的語句便可:ide

//不加這句話,中文亂碼
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]='\0';
    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文件,一樣也遇到了中文亂碼問題。參照此處的文章,順利解決,感謝原做者的分享。編碼

相關文章
相關標籤/搜索