在進行Windows編程時,常常遇到不同字符編碼之間的轉換以對應不同的輸出格式,本文介紹寬字節UTF-8編碼格式和多字節之間的項目轉換。分別調用Windows底層函數MultiByteToWideChar和 WideCharToMultiByte實現。
1.UTF-8轉多字節
std::string u82mb(const char* cont) { if (NULL == cont) { return ""; } int num = MultiByteToWideChar(CP_UTF8, NULL, cont, -1, NULL, NULL); if (num <= 0) { return ""; } wchar_t* buffw = new (std::nothrow) wchar_t[num]; if (NULL == buffw) { return ""; } MultiByteToWideChar(CP_UTF8, NULL, cont, -1, buffw, num); int len = WideCharToMultiByte(CP_ACP, 0, buffw, num - 1, NULL, NULL, NULL, NULL); if (len <= 0) { delete[] buffw; return ""; } char* lpsz = new (std::nothrow) char[len + 1]; if (NULL == lpsz) { delete[] buffw; return ""; } WideCharToMultiByte(CP_ACP, 0, buffw, num - 1, lpsz, len, NULL, NULL); lpsz[len]='\0'; delete[] buffw; std::string rtn(lpsz); delete[] lpsz; return rtn; }
2.多字節轉UTF-8
std::string mb2u8(const char* cont) { if (NULL == cont) { return ""; } int num = MultiByteToWideChar(CP_ACP, NULL, cont, -1, NULL, NULL); if (num <= 0) { return ""; } wchar_t* buffw = new (std::nothrow) wchar_t[num]; if (NULL == buffw) { return ""; } MultiByteToWideChar(CP_ACP, NULL, cont, -1, buffw, num); int len = WideCharToMultiByte(CP_UTF8, 0, buffw, num - 1, NULL, NULL, NULL, NULL); if (len <= 0) { delete[] buffw; return ""; } char* lpsz = new (std::nothrow) char[len + 1]; if (NULL == lpsz) { delete[] buffw; return ""; } WideCharToMultiByte(CP_UTF8, 0, buffw, num - 1, lpsz, len, NULL, NULL); lpsz[len]='\0'; delete[] buffw; std::string rtn(lpsz); delete[] lpsz; return rtn ; }
