sqlite不能用中文路径怎么办 我试过了,只要一使用中文路径就出错谁能解决。会不会是unicode 和 anscii码 的转换问题 怎么弄呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 它是用的UTF8格式,把路径串转换成UTF8就可以支持中文了 #pragma onceclass CTranslateUTF8{public: CTranslateUTF8(void); ~CTranslateUTF8(void); static BOOL AsciiToUnicode(LPWSTR strDes,int &iDesSize,LPCSTR strSrc); static BOOL UnicodeToAscii(LPSTR strDes,int &iDesSize,LPCWSTR strSrc); static BOOL UnicodeToUtf8(LPSTR strDes,int &iDesSize,LPCWSTR strSrc); static BOOL Utf8ToUnicode(LPWSTR strDes,int &iDesSize,LPCSTR strSrc); static BOOL AsciiToUtf8(LPSTR strDes,int &iDesSize,LPCSTR strSrc); static BOOL Utf8ToAscii(LPSTR strDes,int &iDesSize,LPCSTR strSrc);};#include "StdAfx.h"#include "TranslateUTF8.h"CTranslateUTF8::CTranslateUTF8(void){}CTranslateUTF8::~CTranslateUTF8(void){}BOOL CTranslateUTF8::UnicodeToAscii(LPSTR strDes,int &iDesSize,LPCWSTR strSrc){ char* pElementText=NULL; int iTextLen=0; // wide char to multi char iTextLen = WideCharToMultiByte( CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL ); if(iDesSize<iTextLen+2) { iDesSize=iTextLen+2; return FALSE; } pElementText = new char[iTextLen + 1]; memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) ); ::WideCharToMultiByte( CP_ACP, 0, strSrc, -1, pElementText, iTextLen, NULL, NULL ); memcpy(strDes,pElementText,iTextLen); delete[] pElementText; return TRUE;}BOOL CTranslateUTF8::AsciiToUnicode(LPWSTR strDes,int &iDesSize,LPCSTR strSrc){ //int len = 0; //len = strlen(strSrc); int unicodeLen = ::MultiByteToWideChar( CP_ACP, 0, strSrc, -1, NULL, 0 ); if(iDesSize<unicodeLen+2) { iDesSize=unicodeLen+2; return FALSE; } wchar_t * pUnicode=NULL; pUnicode = new wchar_t[unicodeLen+1]; memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); ::MultiByteToWideChar( CP_ACP, 0, strSrc, -1, (LPWSTR)pUnicode, unicodeLen ); memcpy(strDes,pUnicode,unicodeLen*2); delete [] pUnicode; return TRUE; }BOOL CTranslateUTF8::UnicodeToUtf8(LPSTR strDes,int &iDesSize,LPCWSTR strSrc){ char* pElementText=NULL; int iTextLen=0; // wide char to multi char iTextLen = WideCharToMultiByte( CP_UTF8, 0, strSrc, -1, NULL, 0, NULL, NULL ); if(iDesSize<iTextLen+2) { iDesSize=iTextLen+2; return FALSE; } pElementText = new char[iTextLen + 1]; memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) ); ::WideCharToMultiByte( CP_UTF8, 0, strSrc, -1, pElementText, iTextLen, NULL, NULL ); memcpy(strDes,pElementText,iTextLen); delete[] pElementText; return TRUE;}BOOL CTranslateUTF8::Utf8ToUnicode(LPWSTR strDes,int &iDesSize,LPCSTR strSrc){ //int len = 0; //len = strlen(strSrc); int unicodeLen = ::MultiByteToWideChar( CP_UTF8, 0, strSrc, -1, NULL, 0 ); if(iDesSize<unicodeLen+2) { iDesSize=unicodeLen+2; } wchar_t * pUnicode; pUnicode = new wchar_t[unicodeLen+1]; memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); ::MultiByteToWideChar( CP_UTF8, 0, strSrc, -1, (LPWSTR)pUnicode, unicodeLen ); memcpy(strDes,pUnicode,unicodeLen*2); delete [] pUnicode; return TRUE;}BOOL CTranslateUTF8::AsciiToUtf8(LPSTR strDes,int &iDesSize,LPCSTR strSrc){ WCHAR *buf=new WCHAR[iDesSize]; memset(buf,0,iDesSize*2); int len=iDesSize; if(AsciiToUnicode(buf,len,strSrc)) { if(UnicodeToUtf8(strDes,iDesSize,buf)) { delete [] buf; return TRUE; } } delete [] buf; return FALSE;}BOOL CTranslateUTF8::Utf8ToAscii(LPSTR strDes,int &iDesSize,LPCSTR strSrc){ WCHAR *buf=new WCHAR[iDesSize]; memset(buf,0,iDesSize*2); int len=iDesSize; if(Utf8ToUnicode(buf,len,strSrc)) { if(UnicodeToAscii(strDes,iDesSize,buf)) { delete [] buf; return TRUE; } } delete [] buf; return FALSE;} 我用你的东东转换了后得“- path 0x0012ea50 "悌呾氤尘戤逛禍鏉虫厔鎱存惍b锓斤方氇€嶋飥嶋戤戤" 是正常的吗,反正最后还是出错了,你看看我的转换代码用的对不: char currentpath[100]; CTranslateUTF8 toutf8; CString cspath; GetCurrentDirectory(100,currentpath); cspath=_T(currentpath); cspath+=_T("\\MsgData.db"); memset(currentpath,0,100); char path[100]; int size=100; if(!toutf8.UnicodeToUtf8(path,size,(LPCWSTR)(LPCTSTR)cspath)){ MessageBox("转换出错!"); } if(sqlite3_open(currentpath,&m_codedb)!=SQLITE_OK){ MessageBox("不能打开数据库。。"); } CString sqlcheck="select bcheck from code"; char **bcheckresult; char *errmsg; int nrow,ncolumn; if(sqlite3_get_table(m_codedb,sqlcheck,&bcheckresult,&nrow,&ncolumn,&errmsg)!=SQLITE_OK){ MessageBox("不能执行SQLcheck"); }” 懂了 知道了 谢谢 currentpath应该改成path低级错误 急,急,急,在线等!! 字符串查询表问题 如何获取内存里某一进程的某一对象指针?? 急!求助啊,请高手大哥帮忙。非常感谢. 关于对话框DoModal的问题!!! 高手请进来! 程序模拟执行cmd的命令 序列化时进入到异常中了,如何阻止继续执行后面的一段程序,虽然用全局变量可以实现,但总觉得不好,有没有什么好的方法? 菜鸟问题 一段程序 in <Thinkinginc++>请高手指教一下 如何在FTP服务器端解压ZIP文件 当年的毕业设计源码 使用setwindowrgn使得窗口变小后,原来的区域没有刷新怎么办
#pragma onceclass CTranslateUTF8
{
public:
CTranslateUTF8(void);
~CTranslateUTF8(void);
static BOOL AsciiToUnicode(LPWSTR strDes,int &iDesSize,LPCSTR strSrc);
static BOOL UnicodeToAscii(LPSTR strDes,int &iDesSize,LPCWSTR strSrc);
static BOOL UnicodeToUtf8(LPSTR strDes,int &iDesSize,LPCWSTR strSrc);
static BOOL Utf8ToUnicode(LPWSTR strDes,int &iDesSize,LPCSTR strSrc);
static BOOL AsciiToUtf8(LPSTR strDes,int &iDesSize,LPCSTR strSrc);
static BOOL Utf8ToAscii(LPSTR strDes,int &iDesSize,LPCSTR strSrc);
};#include "StdAfx.h"
#include "TranslateUTF8.h"CTranslateUTF8::CTranslateUTF8(void)
{
}CTranslateUTF8::~CTranslateUTF8(void)
{
}BOOL CTranslateUTF8::UnicodeToAscii(LPSTR strDes,int &iDesSize,LPCWSTR strSrc)
{
char* pElementText=NULL;
int iTextLen=0;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_ACP,
0,
strSrc,
-1,
NULL,
0,
NULL,
NULL );
if(iDesSize<iTextLen+2)
{
iDesSize=iTextLen+2;
return FALSE;
}
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_ACP,
0,
strSrc,
-1,
pElementText,
iTextLen,
NULL,
NULL );
memcpy(strDes,pElementText,iTextLen);
delete[] pElementText;
return TRUE;}BOOL CTranslateUTF8::AsciiToUnicode(LPWSTR strDes,int &iDesSize,LPCSTR strSrc)
{
//int len = 0;
//len = strlen(strSrc);
int unicodeLen = ::MultiByteToWideChar( CP_ACP,
0,
strSrc,
-1,
NULL,
0 );
if(iDesSize<unicodeLen+2)
{
iDesSize=unicodeLen+2;
return FALSE;
}
wchar_t * pUnicode=NULL;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_ACP,
0,
strSrc,
-1,
(LPWSTR)pUnicode,
unicodeLen );
memcpy(strDes,pUnicode,unicodeLen*2);
delete [] pUnicode;
return TRUE; }BOOL CTranslateUTF8::UnicodeToUtf8(LPSTR strDes,int &iDesSize,LPCWSTR strSrc)
{
char* pElementText=NULL;
int iTextLen=0;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_UTF8,
0,
strSrc,
-1,
NULL,
0,
NULL,
NULL );
if(iDesSize<iTextLen+2)
{
iDesSize=iTextLen+2;
return FALSE;
}
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_UTF8,
0,
strSrc,
-1,
pElementText,
iTextLen,
NULL,
NULL );
memcpy(strDes,pElementText,iTextLen);
delete[] pElementText;
return TRUE;
}BOOL CTranslateUTF8::Utf8ToUnicode(LPWSTR strDes,int &iDesSize,LPCSTR strSrc)
{
//int len = 0;
//len = strlen(strSrc);
int unicodeLen = ::MultiByteToWideChar( CP_UTF8,
0,
strSrc,
-1,
NULL,
0 );
if(iDesSize<unicodeLen+2)
{
iDesSize=unicodeLen+2;
}
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_UTF8,
0,
strSrc,
-1,
(LPWSTR)pUnicode,
unicodeLen );
memcpy(strDes,pUnicode,unicodeLen*2);
delete [] pUnicode; return TRUE;
}BOOL CTranslateUTF8::AsciiToUtf8(LPSTR strDes,int &iDesSize,LPCSTR strSrc)
{
WCHAR *buf=new WCHAR[iDesSize];
memset(buf,0,iDesSize*2);
int len=iDesSize;
if(AsciiToUnicode(buf,len,strSrc))
{
if(UnicodeToUtf8(strDes,iDesSize,buf))
{
delete [] buf;
return TRUE;
}
}
delete [] buf;
return FALSE;
}BOOL CTranslateUTF8::Utf8ToAscii(LPSTR strDes,int &iDesSize,LPCSTR strSrc)
{
WCHAR *buf=new WCHAR[iDesSize];
memset(buf,0,iDesSize*2);
int len=iDesSize;
if(Utf8ToUnicode(buf,len,strSrc))
{
if(UnicodeToAscii(strDes,iDesSize,buf))
{
delete [] buf;
return TRUE;
}
}
delete [] buf;
return FALSE;
}
char currentpath[100];
CTranslateUTF8 toutf8;
CString cspath;
GetCurrentDirectory(100,currentpath);
cspath=_T(currentpath);
cspath+=_T("\\MsgData.db");
memset(currentpath,0,100);
char path[100];
int size=100;
if(!toutf8.UnicodeToUtf8(path,size,(LPCWSTR)(LPCTSTR)cspath)){
MessageBox("转换出错!");
}
if(sqlite3_open(currentpath,&m_codedb)!=SQLITE_OK){
MessageBox("不能打开数据库。。");
}
CString sqlcheck="select bcheck from code";
char **bcheckresult;
char *errmsg;
int nrow,ncolumn;
if(sqlite3_get_table(m_codedb,sqlcheck,&bcheckresult,&nrow,&ncolumn,&errmsg)!=SQLITE_OK){
MessageBox("不能执行SQLcheck");
}”
懂了 知道了 谢谢 currentpath应该改成path低级错误