转换编码 --GBK---UTF16---UTF8

何时须要转换编码?
你的字符串按GBK编码,但对方要求按UTF16编码。
如:char str[]="你好";
4个字节,发送给对方,但对方只接受UTF16编码windows

VC下的转换方法:
不一样的平台都提供函数来作编码转换,这里介绍在VC下的转换方法
----------------------------------------------------------------------------------------

VC中,用wchar_t表明宽字符,至关于short型。一个wchar_t的数组来存放unicode字符 //unicode采用双字节对字符进行编码;统一的字符编码标准
----------------------------------------------------------------------------------------数组


VS默认是GBK编码 , 因此能用 char text_gbk[]="你好";ide

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:是转换成宽字符的个数spa



注意: 代码中写出来的字体 对应了哪几个字节 这取决于CPP文件自己的编码code

好比 在Centos/Fedora Linux上,能够默认的字符集存储是UTF-8的,因此它是6个字节
而在Windows中文版上,默认按GBK存储,因此它是4字节的。blog

 

// 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;
}