1

我在 C++ 中工作,我正在处理一个 SQLite 数据库。考虑一下:

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

我应该怎么做才能启动包含此字符串的查询?我看到如果我声明我的查询,例如

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

编译器足够聪明,可以以某种方式转换这些宽字符,并且查询实际上按预期工作。但是,我应该如何声明/创建字符查询数组以包含那些讨厌的字符?我尝试了string和它的c_str方法wstring,等等......

我很绝望。提前感谢任何提示。

4

1 回答 1

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

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

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

于 2012-07-03T18:11:07.940 回答