• C++使用sqlite时,中文字符显示乱码问题


    字符串转换时需要先将ANSI转换成UTF8,在字符串前面加L,即L“我的字符串”;

    再利用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]);
    }
    

    主函数使用:

    int main()
    {
    open_db();
    	//create_table();
    	//drop_table();
    	insert_data(00010, "minda", const_cast<char *>(Unicode2Utf8(_T("测测测测测")).c_str()));
    	//insert_data(9,"minda","测测测测测");
    	//insert_data(2, "yuan", "测测测");
    	//insert_data(7, "www","chifan");
    	//search_data(1);
    	search_data("minda");
    	delete_data("yuan");
    	system("pause");
        return 0;
    }
    

    数据库的使用及上面几个函数(open_db,create_table等函数)的定义,在上一篇博客中有详细给出,参看对应网址中的代码即可,拷贝即可使用
    遇到几个问题,具体警告不记得了,以下的方法可以都试试:
    解决方法如下:项目属性中---->C++ -------> 预处理器 ------------> 预处理器定义 ----------> 加一个_X86_

    另外一个问题是:sqlite3.c 编译不过
    解决方法:不使用预编译头

    从sqlite中输出中文时,一直显示不对,原因一是格式问题:UTF8先要转换成unicode类型

    std::wstring UTF8ToUnicode(const string& strin)
    {
    	wstring strOut;
    	int dwNum = MultiByteToWideChar(CP_UTF8, 0, strin.c_str(), -1, 0, 0);
    		wchar_t* pBuffer = new wchar_t[dwNum];
    	if (!pBuffer) { return strOut; }
    	memset(pBuffer, 0, dwNum * sizeof(wchar_t));
    	if (MultiByteToWideChar(CP_UTF8, 0, strin.c_str(), -1, pBuffer, dwNum) >= 0)
    	{
    		strOut = pBuffer;
    	}
    	delete[] pBuffer;
    	return strOut;
    }
    

    另一个大坑就是最后使用wcout输出,控制台一直没有内容,原因就在wcout这个函数上面,具体原因可以参看此篇博客 https://blog.csdn.net/querw/article/details/6690954
    但是这篇博客中给出的方法不能用(是我技术渣不会用),后来找的一个方法,可以正确输出中文,只需在输出时添加两句话,并且需要包含头文件 #include

    这样最终就能正常显示拉~

  • 相关阅读:
    C语言随笔_printf输出多行
    C语言随笔_return答疑
    《疯狂Java讲义》(二十八)---- 异常
    《疯狂Java讲义》(二十七)----泛型
    《疯狂Java讲义》(二十七)---- Collections
    《疯狂Java讲义》(二十六)---- Map
    《疯狂Java讲义》(二十五)---- List 集合
    《疯狂Java讲义》(二十四)---- Set集合
    Problem(2)----How to set eclipse console locale/language
    Problem(1)----Eclipse hangs on copy/cut for JavaScript files
  • 原文地址:https://www.cnblogs.com/ymd12103410/p/11200872.html
Copyright © 2020-2023  润新知