SQLite3未返回特殊字符

时间:2011-12-21 14:13:08

标签: c encoding sqlite

我遇到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应用程序输出中。它成功地展示了一些窗口标题的特殊字符。

我在这里缺少什么?

谢谢。

1 个答案:

答案 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 * ... 嗯,它至少起作用,让我们希望它是最好的解决方案:)