2012-07-03 56 views
1

我正在C++中工作,我正在處理SQLite數據庫。考慮這個:C++中的寬字符串SQLite查詢

wchar_t s[] = L"This is my wide string. ĂÎȘȚÂăîșțâ"; 

我應該怎麼做才能啓動包含此字符串的查詢?我看到,如果我宣佈我的查詢,例如

char q[] = "SELECT * FROM 'mydb' WHERE 'something' LIKE '%ĂÎȘȚÂ%'"; 

的編譯器足夠聰明以某種方式轉換的寬字符和查詢實際工作按預期。但是,仍然應該如何聲明/創建查詢字符數組以包含那些討厭的字符?我試着用string及其c_str方法,wstring等..

我很絕望。在此先感謝您提供任何建議。

回答

2

你不是用字符串連接組合你的SQL,不是嗎?使用佔位符和字符串綁定到正確的佔位符:

char q[] = "SELECT * FROM 'mydb' WHERE 'something' LIKE ?"; 
// ... create sqlite statement 
wstring p = L"ĂÎȘȚÂăîșțâ"; 
sqlite3_bind_text16(stmt, 1, ("%"+p+"%").c_str(), -1, SQLITE_TRANSIENT); 

然而,這段代碼將僅適用於使用UTF-16寬字符串,這基本上是僅適用於Windows系統上運行。建議請勿使用wchar_t因爲it's not portable。改爲使用narrow char UTF-8 encoded strings。即使在Windows上,SQLite也假定所有窄字符字符串都是UTF-8,即使是文件名也是如此。使用這種方法,只需將文件保存爲UTF-8 而無需BOM即可獲得原始代碼。這將使字符串

char q[] = "SELECT * FROM 'mydb' WHERE 'something' LIKE '%ĂÎȘȚÂ%'"; 

在主要編譯器(包括MSVC和GCC)上編碼的UTF-8。

+0

精彩的回答。但是,如何使用窄字符UTF-8編碼的字符串? (原諒我,這可能是一個愚蠢的請求,但我沒有那麼有經驗。) –

+1

@PetruDimitriu:這取決於你想如何「使用」它。如果你將它讀寫到文件或SQLite數據庫中,或者如果你執行大部分其他繁瑣的任務(如搜索ASCII子字符串),那麼你就會忘記它是UTF-8並將其視爲cookie--實質上不會改變代碼。如果你想把文本寫到屏幕上,它變得更加棘手,因爲在Unicode支持下沒有可行的方法。看到鏈接的文章如何與他們合作。 – ybungalobill

+0

所以我首先準備好那個佔位符「?」的聲明,然後我把我的文本綁定到它,對吧? –