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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值