200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码

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

时间:2024-01-25 02:44:51

相关推荐

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

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

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

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

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

//UTF_8 转gb2312void 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文件,同样也遇到了中文乱码问题。参照此处的文章,顺利解决,感谢原作者的分享。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。