zoukankan      html  css  js  c++  java
  • 解决C++项目使用sqlite中文乱码问题

    我参考的是这篇文章:https://www.2cto.com/database/201411/354891.html

    理论是:sqlite使用的是UTF-8,C++中用的字符串是ascii或unicode编码。

             所以使用时候要进行转化。插入中文时候要转化为UTF-8,读取时候再转化回来。

    下面是转化函数,参考文章:https://www.2cto.com/database/201411/354891.html

        //UTF-8转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){
            using namespace std;
            string strRet = "";
            //先把 utf8 转为 unicode 
            wstring wstr = Utf82Unicode(strUtf8Code);
            //最后把 unicode 转为 ascii 
            strRet = WideByte2Acsi(wstr);
            return strRet;
        }
    
    
    
        //ascii 转 Unicode 
        std::wstring Acsi2WideByte(std::string& strascii){
            using namespace std;
            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){
            using namespace std;
            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) {
            using namespace std;
            string strRet("");
            //先把 ascii 转为 unicode 
            wstring wstr = Acsi2WideByte(strAsciiCode);
            //最后把 unicode 转为 utf8 
            strRet = Unicode2Utf8(wstr);
            return strRet;
        }

    使用效果立竿见影:

    可以看出,之前存进数据库的是乱码

    改变之后已经成功将汉字存进去了

  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/rixiang/p/9530367.html
Copyright © 2011-2022 走看看