数据库编码为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文件,一样也遇到了中文乱码问题。参照此处的文章,顺利解决,感谢原做者的分享。编码