简言
1. 现在编程时为了统一中英文,各国语言版本兼容性,我们都使用utf8格式存储字符串
2. mysql保存字符数据时若出现了乱码,例如中文乱码,可以确定是字符集的问题,建议统一改为utf8
3. c/c++语言操作mysql时,使用utf8编码也有很多注意要点,这里笔者做个简单的总结,避免大家踩坑
三个步骤
1. 确保mysql数据库是utf8格式,数据库的表也是utf8格式
2. 连接数据库时,调用函数,明确设置utf8字符集
3. 确保内存中的字符串是utf8编码格式
详细
1. 确保mysql数据库是utf8格式,数据库的表也是utf8格式
可以通过命令查看数据库的格式和数据库表的格式,如下:
使用命令 show create database xxxx; 来查看数据库的编码格式
使用命令 show create table xxxx; 来查看数据库表的编码格式
具体修改为utf8的办法可以使用mysql连接的编辑器来设置,也可以通过命令行来设置,笔者是使用HeidiSQL来设置的,简单
2. 连接数据库时,明确设置utf8字符集
方法比较简单,就是调用几个函数,例如mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8"), mysql_set_character_set(mysql, "utf8")之类,具体的可以参考这篇博客
https://blog.csdn.net/yzf279533105/article/details/103938260
3. 确保内存中的字符串是utf8编码格式
办法如下:以一个汉字为例,比如“严”,查到它的unicode编码为0x4E25, 再手动转为utf8编码,三个字节即
1110 0100 1011 1000 1010 0101 这里我用红色标出了实际的位信息,前面紫色的是utf占位符
第一个字节转数字即228,第二个字节转数字即184,第三个字节转数字即165
我们把字符串“严”逐个字节打印出来即可
代码如下:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
char str[10] = "严";
printf("%u \n", (unsigned char)str[0]);
printf("%u \n", (unsigned char)str[1]);
printf("%u \n", (unsigned char)str[2]);
printf("%u \n", (unsigned char)str[3]);
printf("%u \n", (unsigned char)str[4]);
getchar();
return 0;
}
打印结果如下图(可以看到前三个字节分别是228, 184, 165):
注意:在windows下如果是VisualStudio系列的编辑器,默认是GB2312的编码,必须改成utf8编码后才可以
当然,你也可以更换其他汉字,只是需先查到该汉字的unicode编码,然后手动转成utf8编码格式
可以到这个网站查所有汉字的unicode编码
http://www.mytju.com/classcode/tools/encode_gb2312.asp
可以看到“严”字的unicode是4E25,如下图
另外,如果你不会把unicode编码手动转utf8编码,笔者另外提供了一个函数来判断一个字符串是不是utf8编码
完整代码如下: