c++ - C++ 中的宽字符串 SQLite 查询

标签 c++ sqlite utf-8

我正在使用 C++ 工作,并且正在处理 SQLite 数据库。考虑一下:

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

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

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

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

最佳答案

您没有使用字符串连接来编写 SQL,不是吗?使用占位符并将字符串绑定(bind)到正确的占位符:

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

但是,此代码仅适用于对宽字符串使用 UTF-16 的系统,这基本上仅限于 Windows。建议不要使用 wchar_t 因为 it's not portable 。使用narrow char UTF-8 encoded strings反而。 SQLite 假定所有窄 char 字符串都是 UTF-8,即使对于文件名,甚至在 Windows 上也是如此。使用这种方法,您只需将文件保存为 UTF-8 无 BOM 即可使原始代码正常工作。这将使字符串

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

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

关于c++ - C++ 中的宽字符串 SQLite 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11316226/

相关文章:

C++使用gcov和lcov问题?

c++ - 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

c++ - 将 textBox 传递给函数。 C++

android - OGLES 2 原生 Android : eglCreateWindowSurface Arguments

sqlite - 钛:SQLite数据库存储在哪里?

shell - 如何在shell中查找文件编码类型或将任何编码类型转换为UTF-8?

C++字符串UTF-8编码

qt - SELECT COUNT(*) 在 QML 中不起作用

sqlite - 如何在C++中将unicode字符串插入sqlite?

mysql - UTF-8 仅在 Grails 数据库表中