unicode和utf8编码的互相转换时间:2022-02-23 19:32:18class CUtf8 { public: static std::string Encode(const wchar_t * pSrc) { _uint32_ srcLen = wcslen(pSrc); std::string outBuf; char _b[3] = {0}; for (_uint32_ i = 0; i < srcLen; ++i) { _uint32_ len = UnicodeToUTF8(_b, *(pSrc + i)); for ( _uint32_ j = 0; j < len; ++j ) { outBuf.append(1, _b[j]); } } return outBuf; } static std::wstring Decode(const char* pSrc) { _uint32_ srcLen = strlen(pSrc); std::wstring outBuf; wchar_t ch; for (_uint32_ i = 0; i < srcLen ;) { _uint32_ len = UTF8ToUnicode(&ch, pSrc + i); outBuf.append(1, ch); i += len; } return outBuf; } protected: static int UnicodeToUTF8(char* putf8,wchar_t Unicode) { if (Unicode < 0x80) { putf8[0] = Unicode >> 0 & 0x7F | 0x00; return 1; } else if (Unicode < 0x800) { putf8[0] = Unicode >>6 & 0x1F | 0xC0; putf8[1] = Unicode >>0 & 0x3F | 0x80; return 2; } else { putf8[0] = Unicode >> 12 & 0x0F | 0xE0; putf8[1] = Unicode >> 6 & 0x3F | 0x80; putf8[2] = Unicode >> 0 & 0x3F | 0x80; return 3; } } static int UTF8ToUnicode(wchar_t* Unicode, const char* putf8) { *Unicode = 0; if ((putf8[0] & 0xE0) == 0xE0) { *Unicode |= (putf8[0] & 0x0F) << 12; *Unicode |= (putf8[1] & 0x3F) << 6; *Unicode |= (putf8[2] & 0x3F) << 0; return 3; } else if ((putf8[0] & 0xC0) == 0xC0) { *Unicode |= (putf8[0] & 0x1F) << 6; *Unicode |= (putf8[1] & 0x3F) << 0; return 2; } else { *Unicode |= (putf8[0] & 0x7F) << 0; return 1; } } };