从 SQLite 数据库中读取非 Unicode、非英文文本
Posted
技术标签:
【中文标题】从 SQLite 数据库中读取非 Unicode、非英文文本【英文标题】:Read non-Unicode, non-English text from SQLite database 【发布时间】:2017-04-29 16:44:28 【问题描述】:我们有一个旧的 MFC c++ 应用程序写入 SQLite 数据库和另一个 C# 应用程序从数据库中读取。
C++ 应用程序在俄罗斯 Windows 计算机的数据库中写入“шаг потока работы”(西里尔字符)。
当同一个 C++ 应用程序在西欧(拉丁语)Windows 计算机上读取它时,它会将其读取为“øàã ïîòîêà ðàáîòû”(拉丁语表示)。
当 C# 应用程序读取它时,它会将其读取为“��� ������ ����”(Unicode 表示)。
这些应用程序都没有在数据库中指定编码类型。我想阅读 C# 中的原文。
在阅读文本时,我找不到指定编码类型的正确方法。
我已经尝试过诸如Data Source=c:\mydb.db;Version=3;UTF8Encoding=True;
之类的连接字符串,但到目前为止还没有成功。
我还尝试从“��� ������ ����”中获取字节数组并转换为西里尔文,但失败了。
有谁知道如何从 SQLite 数据库中读取原始的俄语文本?
【问题讨论】:
【参考方案1】:SQLite C API 中的所有普通函数都使用 UTF-8。 C# SQLite 驱动程序自动在 UTF-8 和 C# 字符串编码之间进行转换。
如果您没有从 C# 程序中获得正确的数据,那么很可能 C++ 应用程序实际上并不是 UTF-8。 C++ 应用程序使用不同的代码页给出不同的结果这一事实证实了这一点。
如果可能,修复 C++ 应用程序,或将数据库中的数据从原始编码转换为 UTF-8。作为最后的手段,您可以更改您的 C# 应用程序以将所有字符串作为 blob 读取,然后将它们从原始编码转换为 UTF-8。 (无论如何,您需要知道原始编码是什么。)
【讨论】:
正如我所说,那将是最后的手段。你真的应该首先使用正确的编码。以上是关于从 SQLite 数据库中读取非 Unicode、非英文文本的主要内容,如果未能解决你的问题,请参考以下文章
Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换