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

转载于:https://www.cnblogs.com/yeahgis/p/5422469.html

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

  1. Spark读取MySQL中的数据为DataFrame

    Spark读取JDBC中的数据(以MySQL为例)为DataFrame,有两种方式. //聚合的时候默认分区是200,可以在此设置 val spark = SparkSession.builder() ...

  2. java 操作 word 表格和样式,java读取word表格中的表格 java如何读取word中的excel表格数据...

    Java 利用poi 可以直接读取word中的表格保持样式生1.读取word 2003及word 2007需要的jar包 读取 2003 版本(.doc)的word文件相对来说比较简单,只需要 poi ...

  3. mysql mediumblob读取_JSP如何读取MySql中MEDIUMBLOB字符串 | 学步园

    JSP如何读取MySql中MEDIUMBLOB字符串,并显示? 实现向MYSQL数据库中存储或提取图片文件 一些情况下,需要向数据库中存储一些2进制文件,比如图片文件等,这时候,向数据库存储数据不同于 ...

  4. c 读取mysql中mediumblob_「mediumblob」JSP如何读取MySql中MEDIUMBLOB字符串 - seo实验室

    mediumblob JSP如何读取mysql中mediumBLOB字符串,并显示? 实现向MYSQL数据库中存储或提取图片文件 一些情况下,需要向数据库中存储一些2进制文件,比如图片文件等,这时候, ...

  5. JSP如何读取MySql中MEDIUMBLOB字符串

    JSP如何读取MySql中MEDIUMBLOB字符串,并显示? 实现向MYSQL数据库中存储或提取图片文件 一些情况下,需要向数据库中存储一些2进制文件,比如图片文件等,这时候,向数据库存储数据不同于 ...

  6. java mysql 中文乱码_java读取MySQL中的中文数据显示乱码

    在linux平台(Ubuntu 10.10)上安装MySQL(5.1)和JDK(1.6),然后使用PuTTY远程操作.只将PuTTY的Window -> Translation 中的" ...

  7. Java如何给Mysql中插入year类型数据

    文章目录 Java如何给Mysql中插入year类型数据 实际问题: 解决方案: 从数据库中读取year类型数据到Java 从Java中往数据库存储year数据 Java如何给Mysql中插入year ...

  8. python mysql批量更新_Python批量删除mysql中千万级大量数据的脚本分享

    场景描述 线上mysql数据库里面有张表保存有每天的统计结果,每天有1千多万条,这是我们意想不到的,统计结果咋有这么多.运维找过来,磁盘占了200G,最后问了运营,可以只保留最近3天的,前面的数据,只 ...

  9. mysql重命名数据表称方式_在MySQL中,使用()重命名数据表。_学小易找答案

    [单选题]( )的上海文坛被称为"张爱玲年". [多选题]下列哪些是属于共集放大电路的特点?() [阅读理解]Passage Two Thailand is to ban smok ...

最新文章

  1. mysql必知必会日期函数,MySQL:MySQL必知必会总结
  2. mysql binlog 目录_怎么查看mysql 的binlog日志存放的位置(linux和win)
  3. java ndc_通过slf4j/log4j的MDC/NDC 实现日志追踪
  4. MapReduce-多个Mapper
  5. mysql empty table_【MySQL】 empty table and delete table.
  6. 大佬就是有想法!比尔盖茨办公室曝光:实体版元素周期表震撼!
  7. LeetCode—数据库简单题(三)
  8. Ubuntu系统下go语言环境的搭建
  9. 12.go 源码文件
  10. 详细 C语言自增自减运算符区分 ++n和n++
  11. 程序员的人生——应届生北漂的第三天
  12. php 正则格式化图片,php利用正则表达式格式化电话号码的方法
  13. 拯救剧荒!程序员最爱的美剧TOP5!
  14. Prim算法(JAVA实现-邻接矩阵)
  15. jsp java 上传图片_如何在Jsp上传图片
  16. 【物理应用】大气湍流相位屏仿真matlab源码
  17. 递归组件(简单介绍)
  18. 淘宝TOP程序API接口接入教程--入门篇
  19. 转 RC523读TypeB卡-----读B卡的天线调制过程
  20. 零基础学习韩语的五大学习方式助你…

热门文章

  1. python常用内置模块-python常用的内置模块
  2. python序列类型-Python之序列类型方法
  3. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解
  4. 学python就业要看哪些书-学习Python适合就业哪些岗位?老男孩Python学习
  5. python用于什么-python用于什么
  6. python自学路线-Python最佳学习路线
  7. python写程序求1-3+5-7+...-99+101的值-python基本练习
  8. python爬虫技术可以干什么-Python除了爬虫,还能干啥?
  9. c语言程序大型案例分析,C语言程序设计习题解析与应用案例分析(第2版)
  10. spring jdbc设计与实现