VC++ UTF-8與GBK格式轉換
阿新 • • 發佈:2019-01-04
宣告:本人一個菜鳥,網上搜羅了很多關於VC++程式設計的資料,可每本資料都是涵蓋面太廣,難以細緻。英語又太爛,所以不得意只得摸索,恐又忘記所以記在此處,若有不對的地方,煩勞指出,不勝感激。
author:[email protected]
license:GPL
IDE:Visual Studio 2008
UTF-8和GBK同屬於多位元組MultiByte,轉換思路是先將多位元組的UTF-8或GBK轉換成寬字元(UTF-16),然後再將寬字元轉換成多位元組的GBK或UTF-8。
// 註釋:多位元組包括GBK和UTF-8 int GBK2UTF8(char *szGbk,char *szUtf8,int Len) { // 先將多位元組GBK(CP_ACP或ANSI)轉換成寬字元UTF-16 // 得到轉換後,所需要的記憶體字元數 int n = MultiByteToWideChar(CP_ACP,0,szGbk,-1,NULL,0); // 字元數乘以 sizeof(WCHAR) 得到位元組數 WCHAR *str1 = new WCHAR[sizeof(WCHAR) * n]; // 轉換 MultiByteToWideChar(CP_ACP, // MultiByte的內碼表Code Page 0, //附加標誌,與音標有關 szGbk, // 輸入的GBK字串 -1, // 輸入字串長度,-1表示由函式內部計算 str1, // 輸出 n // 輸出所需分配的記憶體 ); // 再將寬字元(UTF-16)轉換多位元組(UTF-8) n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL); if (n > Len) { delete[]str1; return -1; } WideCharToMultiByte(CP_UTF8, 0, str1, -1, szUtf8, n, NULL, NULL); delete[]str1; str1 = NULL; return 0; }
//UTF-8 GBK int UTF82GBK(char *szUtf8,char *szGbk,int Len) { int n = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, 0); WCHAR * wszGBK = new WCHAR[sizeof(WCHAR) * n]; memset(wszGBK, 0, sizeof(WCHAR) * n); MultiByteToWideChar(CP_UTF8, 0,szUtf8,-1, wszGBK, n); n = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL); if (n > Len) { delete[]wszGBK; return -1; } WideCharToMultiByte(CP_ACP,0, wszGBK, -1, szGbk, n, NULL, NULL); delete[]wszGBK; wszGBK = NULL; return 0; }