快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → Window下,C++-操作-Mysql、Url、utf-8文件-编码问题(读取和写入)

Window下,C++-操作-Mysql、Url、utf-8文件-编码问题(读取和写入)

时间:2022-09-17 08:55:22人气:作者:快盘下载我要评论

mysql

读取mysql表;中文乱码

在sql语句执行前执行mysql_query(&mysql, ;SET NAMES GB2312;);

    mysql_query(&mysql, ;SET NAMES GB2312;);

写入中文到mysql表;中文乱码

在sql语句执行前执行mysql_query(&mysql, ;SET NAMES UTF8;);

    mysql_query(&mysql, ;SET NAMES UTF8;);

URL

当 utf-8格式的url 数据转成字符串;用UrlDecode_UTF8

当 utf-8格式的string 字符串转成普通的std::string;用UTF8_To_string

反之使用string_To_UTF8UrlEncode_UTF8

以下还提供GBK格式url的编码解码

Url;

byte toHex(const byte& x)
{
	return x > 9 ? x - 10 ; ;A; : x ; ;0;;
}

byte fromHex(const byte& x)
{
	return isdigit(x) ? x - ;0; : x - ;A; ; 10;
}

// URL解码;解码为GBK
    std::string URLDecode(std::string strOrg)
    {
        std::string sOut;
        for (size_t ix = 0; ix < strOrg.size(); ix;;)
        {
            byte ch = 0;
            if (strOrg[ix] == %)
            {
                ch = (fromHex(strOrg[ix ; 1]) << 4);
                ch |= fromHex(strOrg[ix ; 2]);
                ix ;= 2;
            }
            else if (strOrg[ix] == ;;;)
            {
                ch = ; ;;
            }
            else
            {
                ch = strOrg[ix];
            }
            sOut ;= (char)ch;
        }
        return sOut;
    }
    
    // URL编码;编码为GBK
    std::string URLEncode(std::string strOrg)
    {
        std::string sOut;
        for (size_t ix = 0; ix < strOrg.size(); ix;;)
        {
            byte buf[4];
            memset(buf, 0, 4);
            if (isalnum((byte)strOrg[ix]))
            {
                buf[0] = strOrg[ix];
            }
            //else if ( isspace( (byte)strOrg[ix] ) ) //貌似把空格编码成%20或者;都可以  
            //{  
            //    buf[0] = ;;;;  
            //}  
            else
            {
                buf[0] = %;
                buf[1] = toHex((byte)strOrg[ix] >> 4);
                buf[2] = toHex((byte)strOrg[ix] % 16);
            }
            sOut ;= (char*)buf;
        }
        return sOut;
    }
    
    std::string GBKToUTF8(const std::string strGBK)
    {
        std::string strOutUTF8 = ;;;
        int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
        wchar_t* str1 = new wchar_t[n];
        MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
        n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
        char* str2 = new char[n];
        WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
        strOutUTF8 = str2;
        delete[] str1;
        delete[] str2;
        return strOutUTF8;
    }
    
    std::string UTF8ToGBK(const std::string strUTF8)
    {
        int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
        wchar_t* wszGBK = new wchar_t[len ; 1];
        memset(wszGBK, 0, (len ; 1) * sizeof(WCHAR));
        MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUTF8.c_str(), -1, wszGBK, len);
        len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
        char* szGBK = new char[len ; 1];
        memset(szGBK, 0, len ; 1);
        WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
        //strUTF8 = szGBK;
        std::string strTemp(szGBK);
        delete[] szGBK;
        delete[] wszGBK;
        return strTemp;
    }
    
    // URL编码;编码为GBK
    std::string UrlEncode_GBK(std::string strOrg)
    {
        return URLEncode(strOrg);
    }
    
    // URL编码;编码为UTF-8
    std::string UrlEncode_UTF8(std::string strOrg)
    {
        return URLEncode(GBKToUTF8(strOrg));
    }
    
    // URL解码;解码为GBK
    std::string UrlDecode_GBK(std::string strOrg)
    {
        return URLDecode(strOrg);
    }
    
    // URL解码;解码为UTF-8
    std::string UrlDecode_UTF8(std::string strOrg)
    {
        return UTF8ToGBK(URLDecode(strOrg));
    }

std::string 和 utf-8 string 相互转换;

   std::string string_To_UTF8(const std::string& str)
    {
        int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
    
        wchar_t* pwBuf = new wchar_t[nwLen ; 1];//一定要加1;不然会出现尾巴
        ZeroMemory(pwBuf, nwLen * 2 ; 2);
    
        ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
    
        int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
    
        char* pBuf = new char[nLen ; 1];
        ZeroMemory(pBuf, nLen ; 1);
    
        ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
    
        std::string retStr(pBuf);
    
        delete[]pwBuf;
        delete[]pBuf;
    
        pwBuf = NULL;
        pBuf = NULL;
    
        return retStr;
    }
    
    std::string UTF8_To_string(const std::string& str)
    {
        int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
    
        wchar_t* pwBuf = new wchar_t[nwLen ; 1];//一定要加1;不然会出现尾巴
        memset(pwBuf, 0, nwLen * 2 ; 2);
    
        MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);
    
        int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
    
        char* pBuf = new char[nLen ; 1];
        memset(pBuf, 0, nLen ; 1);
    
        WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
    
        std::string retStr = pBuf;
    
        delete[]pBuf;
        delete[]pwBuf;
    
        pBuf = NULL;
        pwBuf = NULL;
    
        return retStr;
    }

std::fstream

当fstream对象读取utf-8文件;先将文件内容从Utf-8转为Unicode;再写到std::wstring中;传到fstream内。

示例;

    #include <fstream>
    
    // 读取Utf-8格式的文件;准备写入
    std::fstream  ifile(;path;, std::ios::in | std::ios::out);
    std::string buffer;
    std::wstring wstr = L;;;
    if (!ifile.is_open())
    {
        std::cout << ;文件打开失败;; << std::endl;
        return -1;
    }
    while (std::getline(ifile, buffer))
    {
        wstr ;= tool.UTF8ToUnicode(buffer) ; L;
;;
    }
    ifile.close();
    
    // wstring写入utf-8格式文件
    std::fstream ofile(;path;, std::ios::out);
    std::locale oldLocale1 = ofile.imbue(std::locale(std::locale(;chs;), ;;, LC_CTYPE));
    if (!ofile.is_open())
    {
        std::cout << ;文件打开失败;; << std::endl;
        return -1;
    }
    
    ofile << tool.ToUTF8(wstr );
    ofile.close();
    ofile.imbue(oldLocale1);
    // 转码函数
    
    // 1
    std::string UnicodeToUTF8(const std::wstring& wstr)
    {
        std::string ret;
        try {
            std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
            ret = wcv.to_bytes(wstr);
        }
        catch (const std::exception& e) {
            std::string str = e.what();
        }
        return ret;
    }
    
    std::wstring UTF8ToUnicode(const std::string& str)
    {
        std::wstring ret;
        try {
            std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
            ret = wcv.from_bytes(str);
        }
        catch (const std::exception& e) {
            std::string str = e.what();
        }
        return ret;
    }
    
    std::string ToUTF8(const wchar_t* buffer, int len)
    {
        int size = ::WideCharToMultiByte(CP_UTF8, 0, buffer, len, NULL, 0, NULL, NULL);
        if (size == 0)
            return ;;;
        std::string newbuffer;
        newbuffer.resize(size);
        ::WideCharToMultiByte(CP_UTF8, 0, buffer, len,
            const_cast<char*>(newbuffer.c_str()), size, NULL, NULL);
    
        return newbuffer;
    }
    
    // 2
    std::string ToUTF8(const std::wstring& str)
    {
        return ToUTF8(str.c_str(), (int)str.size());
    }

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。