何時須要轉換編碼?
你的字符串按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; }