QT连接Sqlite数据库,中文路径出错

来源:互联网 发布:重庆国际物流数据 编辑:程序博客网 时间:2024/05/22 04:34

QT对中文的支持是一个很让人头疼的问题,前些天修改了一个连接Sqlite数据库,数据库中文路径出错,现在把怎么解决的做一些记录。
这里写图片描述
我用的是vs2010,首先确定自己用的是Multi-Byte还是UNICODE编码,这两种编码直接决定调用windows的API的时候用的是A版还是MB版,这里以下面这段代码为例子。

#ifdef UNICODE#define GetModuleFileName  GetModuleFileNameW#else#define GetModuleFileName  GetModuleFileNameA#endif // !UNICODE

可以看到,我们用UNICODE编码,调用GetModuleFileName时,其实用的是GetModuleFileNameA这个函数。那么这两个函数有什么却别呢,这就要说到宽字节,跟单字节的区别,UNICODE编码格式的字符串,都是宽字节的,用wchar_t表示。我的理解,UNICODE一般指的是utf16或者utf32,而Multi-Byte一般指的是utf-8.
我用qt写了一个访问sqlite的dll, 采用unicode编码格式。 这个dll被另外一个程序调用的时候,遇到中文路径就会出错。网上一堆解决办法,什么转成utf-8就ok啊,但是我试了都没效果。 研究了一上午,终于被我找到了解决办法。
QT打开数据库的接口如下,参数是QString.

    bool open(const QString& user, const QString& password);

我的接口写成下面这样,为了通用性,我把数据库的路径参数写成了const char *

    bool Open(const char* cDbName,const string &type/* = "QSQLITE"*/)

然后内部,把这个cDbName的编码格式转成了转成了GB18030格式

    QString ToUnicode(const char* src)    {        QTextCodec *codec = QTextCodec::codecForName("GB18030");        QString strDst = codec->toUnicode(src);        return strDst;    }

所有调用这个dll的open函数的程序,都要保证传递进来的路径名是单字节编码的,调用程序如果采用UNICODE编码需要调用WideCharToMultiByte这个函数,保证传递进来的数据库路径是单字节的。QSting有一个utf16()的函数,这个函数返回const unsigned short*. 在保证下面配置为No的情况下,wchar_t是作为unsighed short处理的,这时utf16()返回的就是wchar_t *.
这里写图片描述

其实也可以把这个cDbName的编码格式转成了转成了UTF-8格式
QString ToUTF8(const char* src){    QTextCodec *codec = QTextCodec::codecForName("UTF-8");    QString strDst = codec->toUnicode(src);    return strDst;}

这种情况下,所有调用这个dll的open函数的程序,都要保证传递进来的路径名是宽字节编码的,调用程序如果采用Muti-byte编码需要调用MultiByteToWideChar这个函数,保证传递进来的数据库路径是宽字节的。

总结: 解决中文问题,单字节要对应”GB18030”编码格式, 宽字节编码要对应”UTF-8”编码格式。

0 0