从 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、非英文文本的主要内容,如果未能解决你的问题,请参考以下文章

Python - 读取 Emoji Unicode 字符

Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换

java 中 FileReader能读取啥格式的文件

从 torrent 中读取 Unicode 元数据

Octave:从 sqlite db 文件中读取 BLOB 数据

如何从Java中具有unicode的文件中读取数据?