转换编码 --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;
}

 

posted on 2016-09-22 18:09  洪荒剑君  阅读(2178)  评论(0编辑  收藏  举报

导航