C SQLite3未返回特殊字符

C SQLite3未返回特殊字符,c,encoding,sqlite,C,Encoding,Sqlite,我对SQLite3CAPI有一个问题。我试图从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

我对SQLite3CAPI有一个问题。我试图从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不能显示特殊字符,我尝试用getforegroughindow获取前台窗口标题,并在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这样的函数,我可以从一个简单的字符*中正确打印出é和其他字符,但这里我必须使用wchar_t*。。。 好吧,至少它是有效的,让我们希望它是最好的解决方案: