青岛城阳网站设计,学python网站开发,wordpress是建站工具 还是语言,工商企业信息查询网站1、UTF-8 和 GBK 的区别
GBK#xff1a;通常简称 GB #xff08;“国标”汉语拼音首字母#xff09;#xff0c;GBK 包含全部中文字符。
UTF-8 #xff1a;是一种国际化的编码方式#xff0c;包含了世界上大部分的语种文字#xff08;简体中文字、繁体中文字、英文、… 1、UTF-8 和 GBK 的区别
GBK通常简称 GB “国标”汉语拼音首字母GBK 包含全部中文字符。
UTF-8 是一种国际化的编码方式包含了世界上大部分的语种文字简体中文字、繁体中文字、英文、日文、韩文等语言也兼容 ASCII 码。UTF-8 则包含全世界所有国家需要用到的字符。
2、UTF-8 和 GBK 的作用
这两种编码方式的的作用就是在不同的应用环境中使用特定的编码方式
如果输入字符编码是UTF-8如果想要将信息转换为汉字呈现在显示器上就必须进行GBK转码操作才能在显示屏上看到信息
如果输入字符编码是GBK,如果想要在系统操作中让嵌入式设备或者编程环境认知它就需要进行UTF-8转码操作。
3、UTF-8 和 GBK 之间如何转换
在字符转换的过程中二者不可以直接进行转换必须借助于unicode
3.1、UTF-8转GBK
UTF-8——unicode——GBK
3.2、GBK转UTF-8
GBK——unicode——UTF-8
4、UTF-8 转GBK ——C代码
4.1、引入Win32 因为linux是32位的所以首先需要引入Winsows.h库附带引入iconv.h库
#includeiostream
#includestring
#includestring.h
#ifdef _WIN32
#includeWindows.h
#else
#includeiconv.h
#endif // _WIN32
using namespace std;
#ifndef _WIN32
4.2、定义函数
static size_t Convert(char* from_cha, char* to_char, char* in, size_t inlen, char* out, size_t outlen)
{//转换上下文iconv_t cd;cd iconv_open(to_char, from_cha);if (cd 0){return -1;}memset(out, 0, outlen);char** pin in;char** pout out;//返回转换字节数的数量但是转GBK的时候经常不正确 0就是成功size_t re iconv(cd, pin, inlen, pout, outlen);if (cd ! 0){iconv_close(cd);}cout re (int) re endl;return re;
}
4.2.1、iconv库介绍
iconv库——linux的转换字符编码库 iconv_open()——作用:从字符编码from_char转换为to_char
iconv_open(to_char, from_cha); iconv_close():—— 关闭参数所指定的转换描述符
iconv_close(cd); memset库——memset是C库函数 memset(out, 0, outlen);
out -- 指向要填充的内存块。0 -- 要被设置的值。该值以 int 形式传递但是函数在填充内存块时是使用该值的无符号字符形式。outlen -- 要被设置为该值的字符数。
4.3、统计转换后的字节数 使用内置函数
现在格式是UTF8即CP_UTF8.
int len MultiByteToWideChar(CP_UTF8, //转换的格式0, //默认的转换方式data, //输入的字节-1, //输入的字符串大小 -1找\0结束 自己去算0, //输出不输出统计转换后的字节数0 //输出的空间大小);
4.4、用wtring存储数据并为其分配大小
wstring udata; //用wstring存储的
udata.resize(len);//分配大小 4.5、UTF-8转unicode。
将数据写进去将数据强转为wchar_t类型适用于windows和linux。
MultiByteToWideChar(CP_UTF8, 0, data, -1, (wchar_t*)udata.data(), len); 4.6、unicode转GBK。
现在格式转成GBK即CP_ACP。和UTF-8的参数数量不一样哦
len WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, 0, 0,0, //失败替代默认字符0 //是否使用默认替代 0 false); 4.7、配置字符大小转成GBK
utf8.resize(len);
WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, (char*)utf8.data(), len, 0, 0);
4.8、 UTF-8转GBK完整代码
其他都是一样的只不过加了
#ifdef _WIN32
......
.....
#else
//linuxre.resize(1024);int inlen strlen(data);cout inlen inlen endl;Convert((char*)utf-8, (char*)gbk, (char*)data, inlen, (char*)re.data(), re.size());int outlen strlen(re.data());re.resize(outlen);
#endif
#endif
string UTF8ToGBK2(const char* data)
{string re ;//1、UTF8 先要转为unicode windows utf16
#ifdef _WIN32//1.1 统计转换后的字节数int len MultiByteToWideChar(CP_UTF8, //转换的格式0, //默认的转换方式data, //输入的字节-1, //输入的字符串大小 -1找\0结束 自己去算0, //输出不输出统计转换后的字节数0 //输出的空间大小);if (len 0){return re;}wstring udata; //用wstring存储的udata.resize(len);//分配大小//开始写进去MultiByteToWideChar(CP_UTF8, 0, data, -1, (wchar_t*)udata.data(), len);//2 unicode 转 GBK 转成unicodelen WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, 0, 0,0, //失败替代默认字符0 //是否使用默认替代 0 false);if (len 0){return re;}re.resize(len);WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, (char*)re.data(), len, 0, 0);
#elsere.resize(1024);int inlen strlen(data);cout inlen inlen endl;Convert((char*)utf-8, (char*)gbk, (char*)data, inlen, (char*)re.data(), re.size());int outlen strlen(re.data());re.resize(outlen);
#endifreturn re;
}
5、GBK 转 UTF-8 ——C代码
5.1、统计转换后的字节数
//1.1 统计转换后的字节数int len MultiByteToWideChar(CP_ACP, //转换的格式0, //默认的转换方式data, //输入的字节-1, //输入的字符串大小 -1找\0结束 自己去算0, //输出不输出统计转换后的字节数0 //输出的空间大小);
5.2、用wstring存储数据并为其分配大小
wstring udata; //用wstring存储的
udata.resize(len);//分配大小
5.3、GBK转unicode
//开始写进去MultiByteToWideChar(CP_ACP, 0, data, -1, (wchar_t*)udata.data(), len); 5.4、unicode转UTF-8
//2 unicode 转 utf8len WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, 0, 0,0, //失败替代默认字符0 //是否使用默认替代 0 false); 5.5、配置字符大小转成UTF-8
GBK.resize(len);
WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, (char*)GBK.data(), len, 0, 0);
5.6、GBK 转UTF-8 完整代码
其他都是一样的只不过加了
#ifdef _WIN32
.....
.....
#else
//linuxre.resize(1024);int inlen strlen(data);Convert((char*)gbk, (char*)utf-8, (char*)data, inlen, (char*)re.data(), re.size());int outlen strlen(re.data());re.resize(outlen);
#endif
string GBKToUTF82(const char* data)
{string re ;
#ifdef _WIN32//1、GBK转unicode//1.1 统计转换后的字节数int len MultiByteToWideChar(CP_ACP, //转换的格式0, //默认的转换方式data, //输入的字节-1, //输入的字符串大小 -1找\0结束 自己去算0, //输出不输出统计转换后的字节数0 //输出的空间大小);if (len 0){return re;}wstring udata; //用wstring存储的udata.resize(len);//分配大小//开始写进去MultiByteToWideChar(CP_ACP, 0, data, -1, (wchar_t*)udata.data(), len);//2 unicode 转 utf8 转成unicodelen WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, 0, 0,0, //失败替代默认字符0 //是否使用默认替代 0 false);if (len 0){return re;}re.resize(len);WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, (char*)re.data(), len, 0, 0);
#elsere.resize(1024);int inlen strlen(data);Convert((char*)gbk, (char*)utf-8, (char*)data, inlen, (char*)re.data(), re.size());int outlen strlen(re.data());re.resize(outlen);
#endifreturn re;
}
6、linux虚拟机测试
6.1、创建文件夹
mkdir test_GBK_UTF-8
6.2、进入文件夹
cd test_GBK_UTF-8 6.3、创建test_GBK_UTF-8.cpp文件
vim test_GBK_UTF-8.cpp将刚才代码放进去按下esc键盘输入 :wq (有一个呦)回车 6.4、输入
//g就是运行环境是C
g test_GBK_UTF-8.cpp -o test_GBK_UTF-8 6.5、执行
./test_GBK_UTF-86.6、结果 如果不转码会输出乱码
7、完整代码——基于linux
//GBK转utf-8
#includeiostream
#includestring
#includestring.h
#ifdef _WIN32
#includeWindows.h
#else
#includeiconv.h
#endif // _WIN32
using namespace std;
#ifndef _WIN32
static size_t Convert(char* from_cha, char* to_char, char* in, size_t inlen, char* out, size_t outlen)
{//转换上下文iconv_t cd;cd iconv_open(to_char, from_cha);if (cd 0){return -1;}memset(out, 0, outlen);char** pin in;char** pout out;//返回转换字节数的数量但是转GBK的时候经常不正确 0就是成功size_t re iconv(cd, pin, inlen, pout, outlen);if (cd ! 0){iconv_close(cd);}cout re (int) re endl;return re;
}
#endif // !_WIN32string UTF8ToGBK(const char* data)
{string re ;//1、UTF8 先要转为unicode windows utf16
#ifdef _WIN32//1.1 统计转换后的字节数int len MultiByteToWideChar(CP_UTF8, //转换的格式0, //默认的转换方式data, //输入的字节-1, //输入的字符串大小 -1找\0结束 自己去算0, //输出不输出统计转换后的字节数0 //输出的空间大小);if (len 0){return re;}wstring udata; //用wstring存储的udata.resize(len);//分配大小//开始写进去MultiByteToWideChar(CP_UTF8, 0, data, -1, (wchar_t*)udata.data(), len);//2 unicode 转 GBK 转成unicodelen WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, 0, 0,0, //失败替代默认字符0 //是否使用默认替代 0 false);if (len 0){return re;}re.resize(len);WideCharToMultiByte(CP_ACP, 0, (wchar_t*)udata.data(), -1, (char*)re.data(), len, 0, 0);
#elsere.resize(1024);int inlen strlen(data);cout inlen inlen endl;Convert((char*)utf-8, (char*)gbk, (char*)data, inlen, (char*)re.data(), re.size());int outlen strlen(re.data());re.resize(outlen);
#endifreturn re;
}string GBKToUTF8(const char* data)
{string re ;
#ifdef _WIN32//1、GBK转unicode//1.1 统计转换后的字节数int len MultiByteToWideChar(CP_ACP, //转换的格式0, //默认的转换方式data, //输入的字节-1, //输入的字符串大小 -1找\0结束 自己去算0, //输出不输出统计转换后的字节数0 //输出的空间大小);if (len 0){return re;}wstring udata; //用wstring存储的udata.resize(len);//分配大小//开始写进去MultiByteToWideChar(CP_ACP, 0, data, -1, (wchar_t*)udata.data(), len);//2 unicode 转 utf8 转成unicodelen WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, 0, 0,0, //失败替代默认字符0 //是否使用默认替代 0 false);if (len 0){return re;}re.resize(len);WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)udata.data(), -1, (char*)re.data(), len, 0, 0);
#elsere.resize(1024);int inlen strlen(data);Convert((char*)gbk, (char*)utf-8, (char*)data, inlen, (char*)re.data(), re.size());int outlen strlen(re.data());re.resize(outlen);
#endifreturn re;return re;
}int main()
{std::cout Hello World! 测试\n;//1、测试utf-8转GBK//cout UTF8ToGBK(u8测试UTF-8转GBK) endl;string in u8测试UTF-8转GBK;cout 输入 utf in endl;string gbk UTF8ToGBK2(in.c_str());cout gbk gbk endl;cout GBKToUTF82(gbk.c_str()) endl;system(pause);return 0;
}