我有一个dbf文件,编码为866代码页(DOS)
使用下面的代码,我正在尝试阅读它。 问题是我得到的字符串就像文件在代码页1252中一样。 到目前为止,我已经在SO和其他论坛上检查了其他问题,但没有运气。 正在寻找热点的想法正确地阅读它。
var ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\PathtoFile\;Extended Properties=""dBase 5.0""";
var dBaseConnection = new System.Data.OleDb.OleDbConnection(ConnectionString );
dBaseConnection.Open();
var dBaseCommand = new System.Data.OleDb.OleDbCommand("SELECT * FROM FileName",dBaseConnection);
var dBaseDataReader = dBaseCommand.ExecuteReader(CommandBehavior.SequentialAccess);
while( dBaseDataReader.Read()){
Encoding.GetEncoding(866).GetString(Encoding.GetEncoding(1252).GetBytes(dBaseDataReader.GetString(2)).Dump(); // Does not help
}
答案 0 :(得分:3)
文件来自哪里?其他文件扩展名在同一个文件夹中(例如FPT / CDX / IDX / NTX)?这应该给我们一个关于它是VFP还是dBase或Clipper或其他东西的线索。
如果是Visual Foxpro(VFP)数据,那么您应该从http://www.microsoft.com/en-gb/download/details.aspx?id=14839安装VFPOLEDB提供程序,并使用从http://www.connectionstrings.com/visual-foxpro#vfp-ole-db-provider获取的以下连接字符串之一。
数据库容器(.DBC):
Provider=vfpoledb;Data Source=C:\MyDbFolder\MyDbContainer.dbc;Collating Sequence=machine;
免费表目录:
Provider=vfpoledb;Data Source=C:\MyDataDirectory\;Collating Sequence=general;
连接到单个DBF文件:
Provider=vfpoledb;Data Source=C:\MyDataDirectory\MyTable.dbf;Collating Sequence=machine;
http://msdn.microsoft.com/en-us/library/aa975609%28v=vs.71%29.aspx
上有关VFPOLEDB提供商的更多信息出于兴趣,你怎么知道它被编码为代码页866? Visual Foxpro DBF中偏移29处的字节存储代码页标记。见http://msdn.microsoft.com/en-us/library/aa975386%28v=vs.71%29.aspx
答案 1 :(得分:0)
我没有看到您获得1252个编码数据的证据。您尝试从1252到866代码页的代码失败。因此它不在1252代码页中。我目前修复了驱动程序返回非单字节字符串的问题。也许是你的问题。
解决方案:
检查HKLM \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Xbase \ BDE密钥的值。它必须是2.如果不存在或键不存在(这是我的情况),请创建DWORD参数并将其设置为2.
您可以在此处找到有关此密钥的更多信息:http://support.microsoft.com/kb/307455/en-us