2011-12-21 4 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"또는 "•"를 포함하는 경우, 내가 얻을 때 그 멋진 문자 "Ã ©", "¨"또는 "â €". 나는 약간의 조사를했고 일부 사람들은 실제로 UTF8이 아닌 코드화 된 데이터베이스를 발견했다. 그래서 SQLite Manager와 "PRAGMA encoding"요청으로 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() 같은 기능을 내가 제대로 "é"및 기타 인쇄 관리 발견 캐랙터를 간단하게 char *에서 사용하지만, 여기서는 wchar_t *을 사용해야합니다 ... 글쎄, 적어도 그것이 가장 좋은 해결책 이었으면 좋겠습니다.