1. 程式人生 > >利用純c++和windows api實現gb2312和utf-8兩種編碼格式的轉換

利用純c++和windows api實現gb2312和utf-8兩種編碼格式的轉換

為什麼同樣的字串在兩臺主機上,會出現一個顯示正常,一個顯示亂碼的情況呢?

答案:編碼方式不匹配。

解釋:任何內容在計算機中的儲存形式都是二進位制,不論是在記憶體中還是在硬碟中。所以,同一個字串在兩臺主機上的二進位制儲存是一模一樣的。只是將這個二進位制資料呈現時,發生了變化。呈現字串的過程就是對字串進行編碼,並按照字符集找到該編碼對應的符號,並顯示出來的過程。所以出現了上面亂碼的問題。所以,在utf8編碼和gb2312編碼下都顯示正確、且相同的漢語文字,那麼他們對應的二進位制資料肯定不一樣。這樣表達可能更容易理解。

出現亂碼怎麼辦?按下面的步驟辦:

1,找到傳過來的字串的原始編碼方式

2,找到你主機顯示字串的預設編碼方式

3,轉碼

 

原文地址:點選開啟

//UTF-8到GB2312的轉換

std::string U2G(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
std::string strGb2312 = str;
if(str) delete[] str;
return strGb2312;
}

//GB2312到UTF-8的轉換

std::string G2U(const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
std::string strUtf8 = str;
if(str) delete[] str;
return strUtf8;
}