unicode utf8 ansi 互转

基本概念

ansi编码 是跟国家相关的,在中国编码的是gbk2312字符集, gbk2312 兼容一个字节的ascii. 在日本则是另外一种字符集。

unicode 本身的概念是字符集的概念。但平时口头传输,将unicode 说成字符编码去了。unicode字符集可以用utf8,utf2(utf16),utf4(utf32)等来编码。 

实际上windows上所谓的unicode编码是指usc2编码或者说是utf-16编码,占用两个字节,默认采用ansi(有的时候是一个字节有的时候是两个字节)。linux下unicode编码通常采用utf32,默认采用utf8。



std::string unicodeToUtf8(std::wstring s_unicode)

{
#ifdef WIN32
std::string dest;
int len = WideCharToMultiByte(CP_UTF8, 0, s_unicode.c_str(), -1, NULL, 0, NULL, NULL);
if (len <= 0)
{
return dest;
}
char *pbuffer = (char*)malloc(sizeof(char)*len);
memset(pbuffer, 0, sizeof(char)*len);
WideCharToMultiByte(CP_UTF8, 0, s_unicode.c_str(), s_unicode.size(), pbuffer, len, NULL, NULL);
dest = pbuffer;
free(pbuffer);
return dest;
#endif
}


std::wstring utf8ToUnicode(std::string s_utf8)
{
#ifdef WIN32
std::wstring dest;
int len = MultiByteToWideChar(CP_UTF8, 0, s_utf8.c_str(), -1, NULL, 0);
if (len <= 0)
{
return dest;
}
wchar_t *pbuffer = (wchar_t*)malloc(sizeof(wchar_t)*len);
memset(pbuffer, 0, sizeof(wchar_t)*len);
MultiByteToWideChar(CP_UTF8, 0, s_utf8.c_str(), s_utf8.size(), pbuffer, len);
dest = pbuffer;
free(pbuffer);
return dest;
#endif
}


std::wstring ansiToUnicode(std::string s_ansi)
{
#ifdef WIN32
std::wstring dest;
int len = MultiByteToWideChar(CP_ACP, 0, s_ansi.c_str(), -1, NULL, 0);
if (len <= 0)
{
return L"";
}
wchar_t *pbuffer = (wchar_t*)malloc(sizeof(wchar_t)*len);
memset(pbuffer, 0, sizeof(wchar_t)*len);
MultiByteToWideChar(CP_ACP, 0, s_ansi.c_str(), s_ansi.size(), pbuffer, len);
dest = pbuffer;
free(pbuffer);
return dest;
#endif
}


std::string unicodeToAnsi(std::wstring s_unicode)
{
#ifdef WIN32
std::string dest;
int len = WideCharToMultiByte(CP_ACP, 0, s_unicode.c_str(), -1, nullptr, 0, nullptr, nullptr);
if (len <= 0)
{
return "";
}
char *pbuffer = (char*)malloc(sizeof(char)*len);
memset(pbuffer, 0, sizeof(char)*len);
WideCharToMultiByte(CP_ACP, 0, s_unicode.c_str(), s_unicode.size(), pbuffer, len, nullptr, nullptr);
dest = pbuffer;
free(pbuffer);
return dest;
#endif
}


std::string ansiToUtf8(std::string s_ansi)
{
#ifdef WIN32
return  unicodeToUtf8(ansiToUnicode(s_ansi));
#endif
}
std::string utf8ToAnsi(std::string s_utf8)
{
#ifdef WIN32
return unicodeToAnsi(utf8ToUnicode(s_utf8));
#endif
}

猜你喜欢

转载自blog.csdn.net/qiushangren/article/details/79761763