2012-07-03 61 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

所以我首先准备好那个占位符“?”的声明,然后我把我的文本绑定到它,对吧? –