利用純c++和windows api實現gb2312和utf-8兩種編碼格式的轉換
阿新 • • 發佈:2018-12-03
為什麼同樣的字串在兩臺主機上,會出現一個顯示正常,一個顯示亂碼的情況呢?
答案:編碼方式不匹配。
解釋:任何內容在計算機中的儲存形式都是二進位制,不論是在記憶體中還是在硬碟中。所以,同一個字串在兩臺主機上的二進位制儲存是一模一樣的。只是將這個二進位制資料呈現時,發生了變化。呈現字串的過程就是對字串進行編碼,並按照字符集找到該編碼對應的符號,並顯示出來的過程。所以出現了上面亂碼的問題。所以,在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; }