关于CSqlite中数据库文件中文路径识别问题的解决方法
最近在做一个MFC的项目,要用到sqlite3,具体的版本号不清楚(因为不是自己下载并重新封装的),但是知道还是比较新的,到少是3.6以上的版本。使用的是多字节字符集,中文路径无法识别,为此头疼了好一阵子,也知道是编码问题,网上大家都在说只要把自己所用的编码转成UTF-8就可以了,可是怎么转换都没有用。最后参考了网上的一篇文章才解决了问题(参考文章:http://linshenqi.iteye.com/blog/496746)
之前都是在CSqlite的open函数之外进行编码转换,然后把转换后的文件路径传递给CSqlite::open(CString filePath,...). 后来试着直接修改CSqlite::open函数,在其内部,在给函数sqlite3_open(const char* filePath,...)传递路径之前进行转换,果然解决了问题。具体代码如下:
bool CSQLite::Open( CString inDbName , bool inSynFlag )
{
//数据库名检查
if ( inDbName.IsEmpty() )
{
m_strErrInfo = "数据库文件名为空";
return false;
}
if(!DBExists(inDbName))
{
m_strErrInfo="数据库文件不存在!";
return false;
}
//文件路径的编码转换
int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
int nlen=MultiByteToWideChar(codepage, 0, inDbName, -1, NULL, 0);
WCHAR wBuf[256];
MultiByteToWideChar(CP_ACP, 0, inDbName, -1, wBuf, nlen);
CHAR pBuf[256];
nlen=WideCharToMultiByte(CP_UTF8 , 0, wBuf, -1, 0, 0, 0, 0);
WideCharToMultiByte(CP_UTF8 , 0, wBuf, -1, pBuf, nlen,0, 0);
m_strFileName = pBuf;
//打开数据库
m_nState = sqlite3_open(pBuf, &m_pDb);
if ( SQLITE_OK != m_nState )
{
m_strErrInfo = sqlite3_errmsg(m_pDb);
return false;
}
......
......
}

浙公网安备 33010602011771号