2011-12-21 73 views
1

我遇到SQLite3 C API的问题。我试图从Firefox用来存储很多东西的places.sqlite数据库中读取一些信息。我感兴趣的是检索上次访问的网站和相关的窗口标题。SQLite3不返回的特殊字符

我写这段代码:

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; 
} 

当有它工作正常,无特殊字符,但如果窗口标题包含例如“E”,“E”或“•”,我得到那些美妙的人物“Ô,“è”或“•”。 我做了一些研究,发现有些人实际上得到了非UTF8编码的数据库。所以我用SQLite Manager和“PRAGMA编码”请求检查了places.sqlite数据库编码,都声称它是UTF-8编码。 然后我创建了我自己的数据库,用UTF-8编码,在表格中输入了一些特殊字符,但它也不起作用。所以我认为也许QtCreator(我正在使用)不能显示特殊字符,我试图用GetForegroundWindow()获得前景窗口标题并将其打印在QtCreator应用程序输出中。它成功地展示了一些窗口标题的特殊字符。

我在这里错过了什么?

谢谢。

回答

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()功能我设法正确打印“E”和其他字符从一个简单的char *,但在这里,我必须使用wchar_t * ... 那么,它的作品至少,让我们希望这是最好的解决方案:)