2011-12-20 90 views
1

我來自中國,我有一個關於sqlite的問題,但是我的英語有點差。我會盡力表達自己。在sqlite3中使用漢字

最近,我在使用Visual Studio 2005(VC++)進行WinCE開發的sqlite中使用了一個sqlite數據庫。在我的表格中,一個字段包含一些中文字符。當我展示這些時,我沒有得到我想要的,因爲他們都是陌生人物。

我使用函數的'我想要的返回列值,但我不能。

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); 
// or 
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); 

他們說sqlite3中的編碼是utf8,所以你需要把它轉換成unicode。我試圖用看起來像這樣在互聯網上發現了一個函數來完成這項工作:

wstring UTF8ToUnicode(const string& strin) 
{ 
    wstring strOut; 
    int dwNum = MultiByteToWideChar(CP_UTF8,0,strin.c_str(),-1,0,0) 
    wchar_t* pBuffer = new wchar_t[dwNum]; 
    if (!pBuffer){return strOut;} 
    memset(pBuffer,0,dwNum*sizeof(wchar_t)); 
    if (MultiByteToWideChar(CP_UTF8,0,strin.c_str(),-1,pBuffer,dwNum)>=0) 
    { 
     strOut= pBuffer; 
    } 
    delete[] pBuffer; 
    return strOut; 
} 
+0

請標記語言(C++)。 – 2011-12-20 10:34:12

+0

您可能想要解釋_「我使用函數的'返回列值,但我不能。」_...真的不知道在那裏創建了什麼點。 – jro 2011-12-20 10:42:03

回答

4

「他們說在sqlite3的的編碼是UTF8」

凡說這是錯誤的。使用的編碼取決於數據庫如何打開。

「如果使用sqlite3_open16(),則調用sqlite3_open()或sqlite3_open_v2()時,數據庫的默認編碼爲UTF-8;如果使用本機字節順序,UTF-16將爲UTF-16。

http://sqlite.org/c3ref/open.html

然而,這並不重要。但是,數據存儲sqlite3_column_text()將始終返回UTF8和sqlite3_column_text16()將始終以本機字節順序返回UTF16。您不需要編寫yopur自己的轉換代碼。唯一的區別是效率 - 在沒有轉換的情況下提取存儲的數據會稍微快一點。

1

在您撥打const sqlite3_column_text16之後,您是否打電話給sqlite3_column_bytes?如果你這樣做,那會改變字符到字節。這是我的代碼,以獲得中文它運作良好。

void sqlite3_column_string16(sqlite3_stmt* stmt, int col, std::wstring* str) { 
    int len = sqlite3_column_bytes(stmt, col); 
    const wchar_t* c_str = static_cast<const wchar_t*>(sqlite3_column_text16(stmt, col)); 
    if (c_str && len > 0) 
     str->assign(c_str, len); 
    else 
     *str = _T(""); 
}