首页 > 代码库 > 转换编码 --GBK---UTF16---UTF8

转换编码 --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转成 utf16int 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再转成UTF8int 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