在C++中向SQLite数据库写入Unicode字符串

5
我正在使用sqlite和c++构建一个管理游戏。我已经找到了几乎涵盖创建游戏所需的所有领域的教程,但有一个小问题困扰我已经很长时间。
例如,当我在c++中编写字符串"Andreas Klöden"并将其与sqlite语句一起使用以将数据插入我的sqlite数据库时,具有umlaut ö的特殊字符丢失了,这也适用于许多像Léfevre、Würth等欧洲人名。
我已经搜索了答案,似乎c++字符串是ANSII或类似的东西。为了避免下面显示的问题,应该以unicode字符串的形式编写。

http://imageshack.dk//viewimage.php?file=/imagesfree/0Ej53884.png

有人知道如何在C++中编写Unicode字符串,以便我可以从SQLite数据库中正确地导入/导出数据吗?


1
你看过 std::wstring 吗? - maress
并不存在所谓的ANSII;它看起来像是ASCII(一种7位字符集)和ANSI(微软对类似于Latin-1的8位字符集的误称)的混合体。有许多不同的方法来表示Unicode字符串。UTF-8通常是最好的选择,但Windows喜欢使用UTF-16。 - Keith Thompson
2个回答

4
SQLite“支持”UTF-8(引号在这里,因为基本上UTF8只使用ASCII字符,所以实际上没有什么需要“支持”的)。因此,使用UTF-8编码是最好的(也是向后兼容的)方法之一。SQLite中也存在wchar_t支持,但只有一个原因可以使用它:如果您的代码已经依赖于wchar_t。
如果“UTF-8”不是熟悉的主题,请阅读此内容:http://www.joelonsoftware.com/articles/Unicode.html 调用C API。
sqlite_exec(db_conn, "insert somevalue into sometable values(\"utf encoded string\""), NULL, NULL, "error");

实际的转换可以手动完成,如果您只需要支持有限数量的代码页或使用ICU库进行完全支持。还有像http://utfcpp.sourceforge.net/这样的库。

CodeProject也有很多UTF-8示例代码:

http://www.codeproject.com/Articles/14637/UTF-8-With-C-in-a-Portable-Way

http://www.codeproject.com/Articles/5281/UTF-8-Encoding-and-Decoding

等等。


非常感谢,我会尝试使用这些建议并返回结果 :) - TPhoton
不客气。我不会发布未经检查的答案,相信我,我也有多年使用母语西里尔字母的困扰,所以UTF-8是一个很大的解脱 :) - Viktor Latypov
好的,我已经成功创建了一个SQLite插入语句作为const wchar_t命令。 下一个问题是当我在C++中编写SQLite命令时: rc = sqlite3_exec(db, sqlInsertTest, NULL, NULL, &error);它说无法从const char转换为const wchar_t,所以它希望一个标准char而不是特殊的wchar_t。你知道是否有一个等效的SQLite函数可以用于wchar_t吗? - TPhoton
底线是,在wchar_t的情况下使用prepare/step/finalize API。Exec()已经过时了。 - Viktor Latypov

-1

CppSqlite3U是为了作为sqlite3的包装器而开发的,因为它不支持UNICODE。CppSqlite3U可以用作你的UNICODE调用的前端。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接