我正在使用 C# 和 .NET 3.5,尝试使用 ODBC 和 Microsoft dBase 驱动程序从旧 dbf 文件导入一些数据。
dbf 采用 dBase III 格式,并使用 ibm850 字符串编码。
现在,当我在我的机器上运行我的程序时,从 OdbcDataReader 读取的所有字符串数据都会转换为 UTF-16 或 UTF-8 或其他内容,idk 和我将其保存为 UTF-8 并且一切正常,但是当我尝试在 XP 机器上使用此程序时,某些字符无法正确转换为 UTF-8。例如“Õ”。可能还有其他一些。像“Ä”、“Ö”和“Ü”这样的字符都可以。这就是问题。
也许 ODBC 或驱动程序使用了一些机器文化信息或其他东西来搞乱一切。
是否可以从数据库中以二进制形式读取字符串?也许有一些函数,如 CONVERT 或 CAST?或者我在哪里可以找到适用于此 dBase 驱动程序或其他驱动程序的 SQL 函数和语法的一些参考?我四处寻找,却什么也没找到。使用ODBC和SQL时我感觉自己很盲目。
现在我正在使用一个临时 hack,将所有 σ 替换为 Õ。
Thanks!
示例代码:
System.Data.Odbc.OdbcConnection oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};DriverID=277;Dbq=" + dbPath + ";";
oConn.Open();
System.Data.Odbc.OdbcCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT name FROM " + dbPath + "TABLE.DBF";
System.Data.Odbc.OdbcDataReader reader = oCmd.ExecuteReader();
reader.Read();
byte[] buf = Encoding.UTF8.GetBytes(reader.GetString(0));
BinaryWriter writer = new BinaryWriter(File.Open(@"C:\DBF\Test.txt", FileMode.Create));
writer.Write(buf);
Result:
dbf 中的 E5(850 中的 Õ)
pc1 上的 Test.txt:C3 95(UTF-8 格式的 Õ)
pc2 上的 Test.txt:CF 83(UTF-8 中的 σ)
如果您对这些文件仍有疑问,我也许可以帮助您。
文件中偏移量 29(十进制)处的“代码页字节”又名“语言驱动程序 ID”(LDID) 中有什么?
我有一个基于 Python 的 DBF 阅读器,它可以读取几乎任何字段数据类型和任何代码页——它有一个从代码页字节到代码页编号的各种映射源编译而成的长列表。选项包括 (1) 相信 LDID,提供 Unicode (2) 忽略 LDID,提供未解码的字节 (3) 覆盖 LDID,使用特定代码页解码为 Unicode。当然可以将 Unicode 编码为 UTF-8。
DBF 阅读器还会进行大量合理性交叉检查,这可能有助于调查 VFP 认为文件已损坏的原因。
你怎么知道它使用的是IBM850?我拥有的另一段 Python 代码是一个原型编码检测器,与源自 Mozilla 代码的“chardet”等检测器不同,它不是以 Web 为中心的,并且可以愉快地识别大多数旧的 DOS 代码页 - 这可能会有所帮助。
观察:代码页 437 中的希腊字母小写西格玛 (σ) 是 0xE5,代码页 850 继承了它——“pc2”似乎有点过时了……
如果您认为我可以提供任何帮助,请随时给我发电子邮件 insert_punctuation("sjmachin", "lexicon", "net")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)