转换编码 --GBK---UTF16---UTF8
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转换编码 --GBK---UTF16---UTF8相关的知识,希望对你有一定的参考价值。
什么时候需要转换编码?
你的字符串按GBK编码,但对方要求按UTF16编码。
如:char str[]="你好";
4个字节,发送给对方,但对方只接受UTF16编码
VC下的转换方法:
不同的平台都提供函数来做编码转换,这里介绍在VC下的转换方法
----------------------------------------------------------------------------------------
VC中,用wchar_t代表宽字符,相当于short型。一个wchar_t的数组来存放unicode字符 //unicode采用双字节对字符进行编码;统一的字符编码标准
----------------------------------------------------------------------------------------
VS默认是GBK编码 , 所以能用 char text_gbk[]="你好";
GBK->UTF16 //GBK转成 utf16
UTF16->UTF8 //utf16 转成 utf8
0xC4,0xE3,0xBA,0xC3
int n = MultiByteToWideChar(CP_ACP, 0, text_gbk, //CP_ACP:当前活动代码页(当前是vs中文版,所以现在是GBK) 将GBK转换成WideChar(宽字符)
//text_gbk:输入字符串(是GBK编码的字符串);
strlen(text_gbk), //strlen(text_gbk):输入字符串的长度
text_utf16, 256); //text_utf16, 256:输出到text_utf16 和 输出的最大长度 返回值int n:是转换成宽字符的个数
注意: 代码中写出来的字体 对应了哪几个字节 这取决于CPP文件本身的编码
比如 在Centos/Fedora Linux上,可以默认的字符集存储是UTF-8的,所以它是6个字节
而在Windows中文版上,默认按GBK存储,所以它是4字节的。
// CharacterSet.cpp : 定义控制台应用程序的入口点。 // #include<stdio.h> #include<winsock2.h> #include<windows.h> //GBK->UTF-16 //GBK转成 utf16 int test1() { //char text_gbk[] = { 0xC4, 0xE3, 0xBA, 0xC3 }; char text_gbk[] = "你好";//字符串字面常量,取决于cpp文件本身的字 wchar_t text_utf16[256] = { 0 }; int n = MultiByteToWideChar(CP_ACP, 0, text_gbk, //CP_ACP:当前活动代码页(当前是vs中文版,所以现在是GBK) 将GBK转换成WideChar(宽字符) //text_gbk:输入字符串(是GBK编码的字符串); strlen(text_gbk), //strlen(text_gbk):输入字符串的长度 text_utf16, 256); //text_utf16, 256:输出到text_utf16 和 输出的最大长度 返回值int n:是转换成宽字符的个数 printf("%d个宽字符", n); return 0; } //GBK->UTF-16->UTF8 //国标库转成 UTF16再转成UTF8 int test2() { char text_gbk[] = "你好"; //先把GBK转换成UTF16 wchar_t text_utf16[256] = { 0 }; int n1 = MultiByteToWideChar(CP_ACP, 0, text_gbk, strlen(text_gbk), text_utf16, 256); //再把utf16转换成utf8 char text_utf8[256]; int n2 = WideCharToMultiByte(CP_UTF8, 0, text_utf16, n1, text_utf8, 256, NULL, 0); } int main() { test1(); return 0; }
以上是关于转换编码 --GBK---UTF16---UTF8的主要内容,如果未能解决你的问题,请参考以下文章