关于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;
      }
    ......
    ......
}

  

posted @ 2012-02-08 10:45  阿洒  阅读(535)  评论(0)    收藏  举报