gpt4 book ai didi

c - SQLite3 不返回特殊字符

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:45 25 4
gpt4 key购买 nike

我对 SQLite3 C API 有疑问。我正在尝试从 places.sqlite 数据库中读取一些信息,Firefox 用来存储很多东西。我感兴趣的是检索上次访问的网站和关联的窗口标题。

我写了这段代码:

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 管理器和“PRAGMA 编码”请求检查了 places.sqlite 数据库编码,都说它是 UTF-8 编码的。然后我创建了自己的数据库,以 UTF-8 编码,在表格中输入了一些特殊字符,但它也没有用。所以我认为 QtCreator(我正在使用)可能无法显示特殊字符,我尝试使用 GetForegroundWindow() 获取前景窗口标题并将其打印在 QtCreator 应用程序输出中。成功显示了部分窗口标题的特殊字符。

我在这里错过了什么?

谢谢。

最佳答案

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 *...好吧,它至少有效,希望它是最好的解决方案:)

关于c - SQLite3 不返回特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8591163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com