C+中的宽字符串SQLite查询+; 我在C++中工作,我在处理SQLite数据库。考虑这一点: wchar_t s[] = L"This is my wide string. ĂÎȘȚÂăîșțâ";

C+中的宽字符串SQLite查询+; 我在C++中工作,我在处理SQLite数据库。考虑这一点: wchar_t s[] = L"This is my wide string. ĂÎȘȚÂăîșțâ";,c++,sqlite,utf-8,C++,Sqlite,Utf 8,如何启动包含此字符串的查询?例如,我看到如果我声明我的查询 char q[] = "SELECT * FROM 'mydb' WHERE 'something' LIKE '%ĂÎȘȚÂ%'"; 编译器足够聪明,可以以某种方式转换这些宽字符,查询实际上可以按预期工作。但是,我应该如何声明/创建字符的查询数组以包含这些讨厌的字符呢?我尝试了string及其c_str方法、wstring等 我非常绝望。提前感谢您提供的任何提示。您不是在用字符串连接编写SQL,对吗?使用占位符并将字符串绑定到右侧

如何启动包含此字符串的查询?例如,我看到如果我声明我的查询

 char q[] = "SELECT * FROM 'mydb' WHERE 'something' LIKE '%ĂÎȘȚÂ%'";
编译器足够聪明,可以以某种方式转换这些宽字符,查询实际上可以按预期工作。但是,我应该如何声明/创建字符的查询数组以包含这些讨厌的字符呢?我尝试了
string
及其
c_str
方法、
wstring


我非常绝望。提前感谢您提供的任何提示。

您不是在用字符串连接编写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
,因为。改用。SQLite假定所有窄字符字符串都是UTF-8,即使对于文件名,即使在Windows上也是如此。使用这种方法,您只需将文件保存为UTF-8而不使用BOM,就可以使原始代码正常工作。这将使字符串

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

UTF-8在主要编译器(包括MSVC和GCC)上编码。

答案很好。但是如何使用窄字符UTF-8编码字符串?(请原谅,这可能是一个愚蠢的请求,但我没有那么丰富的经验。)@PetruDimitriu:嗯,这取决于你想如何“使用”它。如果您在文件或SQLite数据库中读写它,或者执行大多数其他琐碎的任务,如搜索ASCII子字符串,那么您就忘记了它是UTF-8,并将其视为cookie,基本上不会更改任何代码。如果您想将文本写入屏幕,这将变得更加棘手,因为使用Unicode支持无法实现这一点。请参阅链接文章“如何使用它们”。因此,首先我用占位符“?”准备语句,然后将文本绑定到它,对吗?@PetruDimitriu:是的,有关详细信息,请参阅。您能否解释一下,什么是
stmt
参数,我在谷歌上搜索了一下,发现它需要使用
sqlite3\u prepare16
创建,但无法理解如何使用它。