我遇到SQLite3 C API问题。我正在尝试从places用于存储许多内容的places.sqlite数据库中读取一些信息。我感兴趣的是检索上次访问过的网站和相关的窗口标题。
我写了这段代码:
query = "SELECT `url`, `title` FROM `moz_places` WHERE `id`=(SELECT `place_id` FROM `moz_historyvisits` ORDER BY `id` DESC LIMIT 1)";
stmt = NULL;
if (sqlite3_prepare_v2(db, query.c_str(), strlen(query.c_str()) + 1, &stmt, NULL) != SQLITE_OK)
cerr << sqlite3_errmsg(db) << endl;
else
{
while ((ret = sqlite3_step(stmt)) == SQLITE_ROW)
cout << sqlite3_column_text(stmt, 0) << endl << sqlite3_column_text(stmt, 1) << endl;
if (ret != SQLITE_DONE)
cerr << sqlite3_errmsg(db) << endl;
}
当没有特殊字符时它可以正常工作,但如果窗口标题包含“é”,“è”或“•”等,我会得到那些精彩的字符“Ô,“Ô或“â” €¢”。
我做了一些研究,发现有些人实际上有非UTF8编码的数据库。所以我用SQLite Manager和“PRAGMA编码”请求检查了places.sqlite数据库编码,两者都说它是UTF-8编码的。
然后我创建了自己的数据库,以UTF-8编码,在表格中输入了一些特殊字符,但它也没有用。所以我认为也许QtCreator(我正在使用)无法显示特殊字符,我试图用GetForegroundWindow()
获取前景窗口标题并将其打印在QtCreator应用程序输出中。它成功地展示了一些窗口标题的特殊字符。
我在这里缺少什么?
谢谢。
答案 0 :(得分:0)
Weel,似乎我设法通过使用我写的这个函数来解决这个问题:
wchar_t *char_to_wchar(const char *str)
{
wchar_t *wbuf;
int wsz;
if (!str)
return (NULL);
wbuf = NULL;
wsz = MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuf, 0);
if (wsz)
wbuf = (wchar_t*)malloc(wsz * sizeof(*wbuf));
else
cerr << "MultiByteToWideChar fail getting required size: " << GetLastError() << endl;
if (wbuf)
{
if (!MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuf, wsz))
cerr << "MultiByteToWideChar fail: " << GetLastError() << endl;
}
return (wbuf);
}
尽管如此,我发现使用像GetWindowText()
这样的功能我很奇怪我设法从一个简单的char *
正确打印“é”和其他字符,但在这里我必须使用wchar_t *
...
嗯,它至少起作用,让我们希望它是最好的解决方案:)