4,011
社区成员
发帖
与我相关
我的任务
分享
static void UnicodeToAnsi(const wchar_t* srcStr, char* destStr, const UINT & nMaxBytesToConvert) {
int nLen = WideCharToMultiByte(CP_ACP, 0, srcStr, -1, NULL, 0, NULL, NULL);
if(nLen) {
char* p = new char[nLen];
WideCharToMultiByte(CP_ACP, 0, srcStr, -1, p, nLen, NULL, NULL);
strcpy_s(destStr, nMaxBytesToConvert, p);
MultiDelete(p);
}
}
static void AnsiToUnicode(const char* srcStr, wchar_t* destStr, const UINT & nMaxBytesToConvert) {
int nLen = MultiByteToWideChar(CP_ACP, 0, srcStr, -1, NULL, 0);
if(nLen) {
wchar_t * pUnicode = new wchar_t[nLen];
MultiByteToWideChar(CP_ACP, 0, srcStr, -1, pUnicode, nLen);
wcscpy_s(destStr, nMaxBytesToConvert, pUnicode);
MultiDelete(pUnicode);
}
}
wchar_t *p = L"・";
MessageBox(p);
char buf[10];
memset(buf, 0, 10);
UnicodeToAnsi(p, buf, 10);
CString cs(buf);
MessageBox(cs);
wchar_t buf2[10];
memset(buf2, 0, 20);
AnsiToUnicode(buf, buf2, 10);
MessageBox(buf2);
wchar_t *sql = L"INSERT INTO Producer VALUES(NULL, '爱德华・维克多')"
直接单引号就行, int ret;
ret = sqlite3_open16("./db/anime.db", &db);
if(ret != SQLITE_OK) {
MessageBox(L"Access Failed!");
return TRUE;
}
wchar_t *sql = L"INSERT INTO Producer VALUES(NULL, '爱德华・维克多')";
sqlite3_stmt *stmt;
const void *tail = NULL;
if(sqlite3_prepare16(db, sql, wcslen(sql) * 2, &stmt, &tail) != SQLITE_OK) {
MessageBox(L"Error");
}
else {
sqlite3_step(stmt);
}
sqlite3_open16没有报错,但是sqlite3_prepare16报错了,我不知道怎么查看错误信息const WCHAR* errorstr = (LPWSTR)sqlite3_errmsg16(db);
看下出错信息.
还有你的Producer表是怎么样的,储存'爱德华・维克多'的字段是什么类型? wchar_t *sql = L"INSERT INTO Producer VALUES(NULL, \"爱德华・维克多\")";
sqlite3_stmt *stmt;
const void *tail = NULL;
if(sqlite3_prepare16_v2(db, sql, wcslen(sql) * 2, &stmt, &tail) == SQLITE_OK) {
MessageBox(L"OK");
sqlite3_step(stmt);
}
然而查看数据库,发现存进去的内容变成了乱码。[/quote]
你下断点调试下,看内存数据,是不是UNICODE编码的汉字.
比如"爱德化"UNICODE编码等于0x3172,0xb75f, 0x4e53
[/quote]
这是问题必定出在sqlite3_prepare16_v2内部的,貌似不好调试。 wchar_t *sql = L"INSERT INTO Producer VALUES(NULL, \"爱德华・维克多\")";
sqlite3_stmt *stmt;
const void *tail = NULL;
if(sqlite3_prepare16_v2(db, sql, wcslen(sql) * 2, &stmt, &tail) == SQLITE_OK) {
MessageBox(L"OK");
sqlite3_step(stmt);
}
然而查看数据库,发现存进去的内容变成了乱码。[/quote]
你下断点调试下,看内存数据,是不是UNICODE编码的汉字.
比如"爱德化"UNICODE编码等于0x3172,0xb75f, 0x4e53
wchar_t *sql = L"INSERT INTO Producer VALUES(NULL, \"爱德华・维克多\")";
sqlite3_stmt *stmt;
const void *tail = NULL;
if(sqlite3_prepare16_v2(db, sql, wcslen(sql) * 2, &stmt, &tail) == SQLITE_OK) {
MessageBox(L"OK");
sqlite3_step(stmt);
}
然而查看数据库,发现存进去的内容变成了乱码。