天天看點

Unicode、UTF-8和GB2312的轉換

#include <iostream>

#include <string>

#include <Windows.h>

using namespace std;

void unicodeToUTF8(const wstring &src, string& result)

{

int n = WideCharToMultiByte( CP_UTF8, 0, src.c_str(), -1, 0, 0, 0, 0 );

result.resize(n);

::WideCharToMultiByte( CP_UTF8, 0, src.c_str(), -1, (char*)result.c_str(), result.length(), 0, 0 );

}

void unicodeToGB2312(const wstring& wstr , string& result)

{

int n = WideCharToMultiByte( CP_ACP, 0, wstr.c_str(), -1, 0, 0, 0, 0 );

result.resize(n);

::WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, (char*)result.c_str(), n, 0, 0 );

}

void utf8ToUnicode(const string& src, wstring& result)

{

int n = MultiByteToWideChar( CP_UTF8, 0, src.c_str(), -1, NULL, 0 );

result.resize(n);

::MultiByteToWideChar( CP_UTF8, 0, src.c_str(), -1, (LPWSTR)result.c_str(), result.length());

}

void gb2312ToUnicode(const string& src, wstring& result)

{

int n = MultiByteToWideChar( CP_ACP, 0, src.c_str(), -1, NULL, 0 );

result.resize(n);

::MultiByteToWideChar( CP_ACP, 0, src.c_str(), -1, (LPWSTR)result.c_str(), result.length());

}

void printByte(string str)

{

int i=0;

for (i=0; i<str.length(); i++)

{

printf("%02X ",(unsigned char)str.at(i));

}

printf("/n");

}

void wprintByte(wstring str)

{

int i=0;

for (i=0; i<str.length()*sizeof(wchar_t); i++)

{

printf("%02X ",*((unsigned char*)str.c_str()+i));

}

printf("/n");

}

int main()

{

string strText = "你好";

string strUTF8;

wstring wstrUnicode;

string strGB2312;

printf("ANSI =%s/n",strText.c_str());

gb2312ToUnicode(strText, wstrUnicode);

printf("Unicode=");

wprintByte(wstrUnicode);

unicodeToUTF8(wstrUnicode, strUTF8);

printf("UTF-8 =");

printByte(strUTF8);

utf8ToUnicode(strUTF8,wstrUnicode);

printf("Unicode=");

wprintByte(wstrUnicode);

unicodeToGB2312(wstrUnicode,strGB2312);

printf("GB2312 =");

printByte(strGB2312);

return 0;

}