数据库编码为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[];
char* rst = new char[pLen + (pLen >> ) + ];
memset(buf,,);
memset(rst,,pLen + (pLen >> ) + ); int i =;
int j = ; while(i < pLen)
{
if(*(pText + i) >= )
{ rst[j++] = pText[i++];
}
else
{
WCHAR Wtemp; UTF_8ToUnicode(&Wtemp,pText + i); UnicodeToGB2312(buf,Wtemp); unsigned short int tmp = ;
tmp = rst[j] = buf[];
tmp = rst[j+] = buf[];
tmp = rst[j+] = buf[]; //newBuf[j] = Ctemp[0];
//newBuf[j + 1] = Ctemp[1]; i += ;
j += ;
} }
rst[j]='\0';
pOut = rst;
delete []rst;
}
void UnicodeToGB2312(char* pOut,WCHAR uData)
{
WideCharToMultiByte(CP_ACP,NULL,&uData,,pOut,sizeof(WCHAR),NULL,NULL);
return;
}
void UTF_8ToUnicode(WCHAR* pOut,char *pText)
{
char* uchar = (char *)pOut; uchar[] = ((pText[] & 0x0F) << ) + ((pText[] >> ) & 0x0F);
uchar[] = ((pText[] & 0x03) << ) + (pText[] & 0x3F); return;
}

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

C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码的更多相关文章

  1. PHP读取mysql中的数据

    <!DOCTYPE HTML> <html> <head> <title> PHP动态读取mysql中的数据 </title> <me ...

  2. MYSQL中约束及修改数据表

    MYSQL中约束及修改数据表 28:约束约束保证数据的完整性和一致性约束分为表级约束和列级约束约束类型包括:    NOT NULL(非空约束)    PRIMARY KEY(主键约束)    UNI ...

  3. 从mysql中拿到的数据构造为列表

    最近测试接口遇到一个问题,用python2.7从mysql中取到的数据是元祖类型的,元祖内部的元素也是一个元祖(并且部分元素的编码格式是unicode的): 类似这样: ((10144, u''), ...

  4. C# 利用mysql.data 在mysql中创建数据库及数据表

    C# 利用mysql.data 在mysql中创建数据库及数据表 using System; using System.Collections.Generic; using System.Linq; ...

  5. 关于如何在mysql中插入一条数据后,返回这条数据的id

    简单的总结一下如何在mysql中出入一条数据后,返回该条数据的id ,假如之后代码需要这个id,这样做起来就变得非常方便,内容如下: <insert id="insertAndGetI ...

  6. UTF-8和GBK编码之间的区别(页面编码、数据库编码区别)以及在实际项目中的应用

    第一节:UTF-8和GBK编码概述 UTF-8 (8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度字符编码,又称万国码,它包含全世界所有国家 ...

  7. php中序列化与反序列化在utf8和gbk编码中测试

    在php中如果我们统一编码是没有什么问题了,但是很多朋友会发现一个问题就是utf8和gbk编码中返回的值会有所区别: php 在utf8和gbk编码下使用serialize和unserialize互相 ...

  8. Spark使用Java、Scala 读取mysql、json、csv数据以及写入操作

    Spark使用Java读取mysql数据和保存数据到mysql 一.pom.xml 二.spark代码 2.1 Java方式 2.2 Scala方式 三.写入数据到mysql中 四.DataFrame ...

  9. 关于Java读取mysql中date类型字段默认值'0000-00-00'的问题

    今天在做项目过程中,查询一个表中数据时总碰到这个问题:      java.sql.SQLException:Value '0000-00-00' can not be represented as ...

随机推荐

  1. 【4_237】Delete Node in a Linked List

    Delete Node in a Linked List Total Accepted: 48121 Total Submissions: 109297 Difficulty: Easy Write ...

  2. hdu 5726(二分)

    GCD Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Sub ...

  3. curl+ post/get 提交

    //测试 内容 固定为 你好  post $curlPost = 'mobile='.$mobile.'&message='.$message.'&memberId='.$member ...

  4. SQLSERVER复制的要点

    SQLSERVER复制的要点 在论坛里经常有人问:SQLSERVER复制出问题了!!SQLSERVER复制不运行了!!SQLSERVER复制遇到阻塞了!! 然后最后来一句:“怎麽办?????????? ...

  5. JS模块间错误隔离

    问题背景: 页面中有多个功能模块,怎么在一个模块出了问题之后,保证其它模块的正常工作. 上面的差不多就是面试官的原话了,姑且称之为模块间错误隔离问题 第一反应是动态按需加载代码,用户操作发生后再加载对 ...

  6. Linux:常用shell快捷键

    按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl+a 将光标移至输入行头,相 ...

  7. 解决Eclipse Debug source not found问题

    解决方法如下:Debug 视图下-->在调试的线程上 右键单击-->选择Edit Source Lookup Path-->选择Add-->选择Java Project选择相应 ...

  8. paip.jdbc 连接自动释放的测试

    paip.jdbc 连接自动释放的测试 使用的mysql jdbc3.1.6  以及5.1.7 测试结果,在没有conn.close()的情况哈.. 作者Attilax  艾龙,  EMAIL:146 ...

  9. JS 基本数据类型

    一.undefined 类型 (ECMAScript 3引入undefined类型) 1.它的值只有一个 undefined 2.未初始化的变量 会隐式转换为undeFined类型 var box; ...

  10. php学习第一讲----php是什么?

    前言:不要在冲动的情况下做任何决定 ——————————————————————————————————————————————————————---- 一.学php之前的一些需要了解的知识 (1)网 ...