ansi unicode utf8之间的转换

std::wstring ansi2unicode(const std::string& ansi)
{
    if (ansi.empty()) {
        return std::wstring(L"");
    }
    int len = MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), -1, NULL, 0);
	std::wstring unicode(len + 2, L'\0');
    len = MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), ansi.size(), &unicode[0], len);
    return unicode;
}

std::string unicode2ansi(const std::wstring& unicode)
{
    if (unicode.empty()) {
        return std::string("");
    }
    int len = WideCharToMultiByte(CP_ACP, 0, unicode.c_str(), -1, NULL, 0, NULL, NULL);
	std::string ansi(len + 1, '\0');
    WideCharToMultiByte(CP_ACP, 0, unicode.c_str(), unicode.size(), &ansi[0], len, NULL, NULL);
    return ansi;
}


 
 
std::wstring ansi2unicode(const std::string& ansi)
{
    if (ansi.empty()) {
        return std::wstring(_T(""));
    }
    int len = MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), -1, NULL, 0);
    wchar_t *tmp = new wchar_t[len+1];
    memset(tmp, 0, sizeof(wchar_t)*(len+1));
    MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), ansi.size(), tmp, len);
    std::wstring ret = tmp;
    delete [] tmp;
    return ret;
}

std::string unicode2ansi(const std::wstring& unicode)
{
    if (unicode.empty()) {
        return std::string("");
    }
    int len = WideCharToMultiByte(CP_ACP, 0, unicode.c_str(), -1, NULL, 0, NULL, NULL);
    char *tmp = new char[len+1];
    memset(tmp, 0, sizeof(char)*(len+1));
    WideCharToMultiByte(CP_ACP, 0, unicode.c_str(), unicode.size(), tmp, len, NULL, NULL);
    std::string ret = tmp;
    delete [] tmp;
    return ret;
}

std::string utf2ansi(const std::string& utf)
{
    if (utf.empty()) {
        return utf;
    }
    int len1 = MultiByteToWideChar(CP_UTF8, 0, utf.c_str(), -1, NULL, 0);
    wchar_t *tmp1 = new wchar_t[len1+1];
    memset(tmp1, 0, sizeof(wchar_t)*(len1+1));
    MultiByteToWideChar(CP_UTF8, 0, utf.c_str(), utf.size(), tmp1, len1);

    int len2 = WideCharToMultiByte(CP_ACP, 0, tmp1, -1, NULL, 0, NULL, NULL);
    char *tmp2 = new char[len2+1];
    memset(tmp2, 0, sizeof(char)*(len2+1));
    WideCharToMultiByte(CP_ACP, 0, tmp1, len1, tmp2, len2, NULL, NULL);
    std::string ret = tmp2;
    delete [] tmp1;
    delete [] tmp2;
    return ret;
}

std::string ansi2utf(const std::string& ansi)
{
    if (ansi.empty()) {
        return ansi;
    }
    int len1 = MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), -1, NULL, 0);
    wchar_t *tmp1 = new wchar_t[len1+1];
    memset(tmp1, 0, sizeof(wchar_t)*(len1+1));
    MultiByteToWideChar(CP_ACP, 0, ansi.c_str(), ansi.size(), tmp1, len1);

    int len2 = WideCharToMultiByte(CP_UTF8, 0, tmp1, -1, NULL, 0, NULL, NULL);
    char *tmp2 = new char[len2+1];
    memset(tmp2, 0, sizeof(char)*(len2+1));
    WideCharToMultiByte(CP_UTF8, 0, tmp1, len1, tmp2, len2, NULL, NULL);
    std::string ret = tmp2;
    delete [] tmp1;
    delete [] tmp2;
    return ret;
}

你可能感兴趣的:(ansi unicode utf8之间的转换)