您的位置:首页 > 编程语言 > C语言/C++

C++编程:ASCII,UTF-8,Unicode字符串相互转换

2016-06-27 16:53 375 查看
[cpp] view
plain copy

#include<string>  

#include<windows.h>  

#include<vector>  

using namespace std;  

  

//utf8 转 Unicode  

  

  

std::wstring Utf82Unicode(const std::string& utf8string)  

{  

    int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0);  

    if (widesize == ERROR_NO_UNICODE_TRANSLATION)  

    {  

        throw std::exception("Invalid UTF-8 sequence.");  

    }  

    if (widesize == 0)  

    {  

        throw std::exception("Error in conversion.");  

    }  

   

    std::vector<wchar_t> resultstring(widesize);  

   

    int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize);  

   

    if (convresult != widesize)  

    {  

        throw std::exception("La falla!");  

    }  

   

    return std::wstring(&resultstring[0]);  

}  

  

  

//unicode 转为 ascii  

  

  

std::string WideByte2Acsi(std::wstring& wstrcode)  

{  

    int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, NULL, 0, NULL, NULL);  

    if (asciisize == ERROR_NO_UNICODE_TRANSLATION)  

    {  

        throw std::exception("Invalid UTF-8 sequence.");  

    }  

    if (asciisize == 0)  

    {  

        throw std::exception("Error in conversion.");  

    }  

    std::vector<char> resultstring(asciisize);  

    int convresult =::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, &resultstring[0], asciisize, NULL, NULL);  

   

    if (convresult != asciisize)  

    {  

        throw std::exception("La falla!");  

    }  

   

    return std::string(&resultstring[0]);  

}  

  

  

   

  

  

//utf-8 转 ascii  

  

  

std::string UTF_82ASCII(std::string& strUtf8Code)  

{  

    std::string strRet("");  

    //先把 utf8 转为 unicode  

    std::wstring wstr = Utf82Unicode(strUtf8Code);  

    //最后把 unicode 转为 ascii  

    strRet = WideByte2Acsi(wstr);  

    return strRet;  

}  

  

  

///////////////////////////////////////////////////////////////////////  

  

  

//ascii 转 Unicode  

  

  

std::wstring Acsi2WideByte(std::string& strascii)  

{  

    int widesize = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, NULL, 0);  

    if (widesize == ERROR_NO_UNICODE_TRANSLATION)  

    {  

        throw std::exception("Invalid UTF-8 sequence.");  

    }  

    if (widesize == 0)  

    {  

        throw std::exception("Error in conversion.");  

    }  

    std::vector<wchar_t> resultstring(widesize);  

    int convresult = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, &resultstring[0], widesize);  

  

  

    if (convresult != widesize)  

    {  

        throw std::exception("La falla!");  

    }  

   

    return std::wstring(&resultstring[0]);  

}  

  

  

//Unicode 转 Utf8  

  

  

std::string Unicode2Utf8(const std::wstring& widestring)  

{  

    int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL);  

    if (utf8size == 0)  

    {  

        throw std::exception("Error in conversion.");  

    }  

   

    std::vector<char> resultstring(utf8size);  

   

    int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL);  

   

    if (convresult != utf8size)  

    {  

        throw std::exception("La falla!");  

    }  

   

    return std::string(&resultstring[0]);  

}  

  

  

//ascii 转 Utf8  

  

  

std::string ASCII2UTF_8(std::string& strAsciiCode)  

{  

    std::string strRet("");  

    //先把 ascii 转为 unicode  

    std::wstring wstr = Acsi2WideByte(strAsciiCode);  

    //最后把 unicode 转为 utf8  

    strRet = Unicode2Utf8(wstr);  

    return strRet;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cpp