Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不同机器上dBase III.dbf文件的编码问题_C#_.net_Encoding_Odbc_Dbf - Fatal编程技术网

C# 不同机器上dBase III.dbf文件的编码问题

C# 不同机器上dBase III.dbf文件的编码问题,c#,.net,encoding,odbc,dbf,C#,.net,Encoding,Odbc,Dbf,我正在使用C#和.NET3.5,试图使用ODBC和MicrosoftDBASE驱动程序从旧的dbf文件导入一些数据 dbf采用dBase III格式,并对字符串使用ibm850编码 现在,当我在我的机器上运行我的程序时,从OdbcDataReader读取的所有字符串数据都转换成UTF-16或UTF-8或其他格式,idk和我将其保存为UTF-8,一切正常,但当我尝试在XP框上使用此程序时,有些字符无法正确转换为UTF-8。”Õ'例如。可能还有其他一些。像‘Ä’、‘Ö’和‘Ü’这样的字符可以。这就是

我正在使用C#和.NET3.5,试图使用ODBC和MicrosoftDBASE驱动程序从旧的dbf文件导入一些数据

dbf采用dBase III格式,并对字符串使用ibm850编码

现在,当我在我的机器上运行我的程序时,从OdbcDataReader读取的所有字符串数据都转换成UTF-16或UTF-8或其他格式,idk和我将其保存为UTF-8,一切正常,但当我尝试在XP框上使用此程序时,有些字符无法正确转换为UTF-8。”Õ'例如。可能还有其他一些。像‘Ä’、‘Ö’和‘Ü’这样的字符可以。这就是问题所在。 可能ODBC或驱动程序使用了一些机器文化信息或其他东西来搞乱一切

是否可以从数据库中读取二进制字符串?也许有些函数像CONVERT或CAST?或者,我在哪里可以找到适用于此dBase驱动程序或其他驱动程序的SQL函数和语法的参考资料?我到处找,什么也没找到。当我使用ODBC和SQL时,我感到很盲目

现在我正在使用一个临时的hack,用Õ替换所有σ

谢谢

示例代码:

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);
结果:

dbf中的E5(850中的Õ)

pc1上的Test.txt:C3 95(UTF-8中的Õ)


pc2上的Test.txt:CF 83(UTF-8中的σ)

您是否尝试过使用Visual Foxpro驱动程序“VFPOleDb”驱动程序?

您是否尝试过使用Visual Foxpro驱动程序“VFPOleDb”驱动程序?

如果您对这些文件仍有问题,我可能会帮助您

文件中偏移量29(十进制)处的“代码页字节”即“语言驱动程序id”(LDID)中有什么内容

我有一个基于Python的DBF阅读器,它可以读取几乎任何字段数据类型和任何代码页——它有一个从代码页字节到代码页编号的各种映射源编译的长列表。选项包括(1)相信LDID,交付Unicode(2)忽略LDID,交付未编码字节(3)覆盖LDID,使用特定代码页解码为Unicode。当然,可以将Unicode编码为UTF-8

DBF阅读器还进行了大量的合理性交叉检查,这可能有助于调查VFP认为文件损坏的原因

你怎么知道它使用的是IBM850?我拥有的另一段Python代码是一个原型编码检测器,它不同于从Mozilla代码派生的“chardet”等检测器,它不是以web为中心的,并且可以愉快地识别大多数旧的DOS代码页——这可能会有所帮助

观察:希腊字母小写sigma(σ)在代码页437中是0xE5,随后是代码页850——“pc2”似乎有点过时


如果你认为我能帮上什么忙,请随时发电子邮件给我,插入标点符号(“sjmachin”、“lexicon”、“net”)

如果你对这些文件仍有问题,我可能可以帮助你

文件中偏移量29(十进制)处的“代码页字节”即“语言驱动程序id”(LDID)中有什么内容

我有一个基于Python的DBF阅读器,它可以读取几乎任何字段数据类型和任何代码页——它有一个从代码页字节到代码页编号的各种映射源编译的长列表。选项包括(1)相信LDID,交付Unicode(2)忽略LDID,交付未编码字节(3)覆盖LDID,使用特定代码页解码为Unicode。当然,可以将Unicode编码为UTF-8

DBF阅读器还进行了大量的合理性交叉检查,这可能有助于调查VFP认为文件损坏的原因

你怎么知道它使用的是IBM850?我拥有的另一段Python代码是一个原型编码检测器,它不同于从Mozilla代码派生的“chardet”等检测器,它不是以web为中心的,并且可以愉快地识别大多数旧的DOS代码页——这可能会有所帮助

观察:希腊字母小写sigma(σ)在代码页437中是0xE5,随后是代码页850——“pc2”似乎有点过时

如果你认为我能帮上什么忙,请随时发电子邮件给我,插入标点符号(“sjmachin”、“lexicon”、“net”)

试试这段代码

var oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + dbPath;
oConn.Open();
var oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT name FROM " + dbPath + "TABLE.DBF";
var reader = oCmd.ExecuteReader();
reader.Read(); 
byte[] A = Encoding.GetEncoding(Encoding.Default.CodePage).GetBytes(reader.GetString(0));
string p = Encoding.Unicode.GetString((Encoding.Convert(Encoding.GetEncoding(850), Encoding.Unicode, A)));
试试这个代码

var oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + dbPath;
oConn.Open();
var oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT name FROM " + dbPath + "TABLE.DBF";
var reader = oCmd.ExecuteReader();
reader.Read(); 
byte[] A = Encoding.GetEncoding(Encoding.Default.CodePage).GetBytes(reader.GetString(0));
string p = Encoding.Unicode.GetString((Encoding.Convert(Encoding.GetEncoding(850), Encoding.Unicode, A)));

当您阅读dbf文件时,您应该了解您应该考虑3种编码类型:

1.数据库提供程序读取文件的编码。这取决于 提供程序和当前操作系统。此编码应用于字节数组接收。例如,在我的电脑上:

  • 当我使用连接字符串“数据源={0}; Provider=Microsoft.JET.OLEDB.4.0;扩展属性=DBase IV;用户 ID=;密码=;”,使用866代码页(俄语)读取字符串 (MS-DOS)

  • 当我使用连接字符串“数据源={0}; Provider=vfpoledb.1;Exclusive=No;排序顺序=Machine”,字符串 使用编码读取。默认值(1251代码页)

2.将字符串写入dbf文件的编码。它可以从29字节的dbf文件中接收,但事实上,无论dbf文件编码是如何标记的,您都应该知道使用了什么编码。该编码应在字符串转换期间用作源编码

3.应将字符串转换为的编码。这通常是UTF-8

因此字符串转换应如下所示:

byte[] bytes = Encoding.GetEncoding(codePage1).GetBytes(reader.GetString(0));

string result = Encoding.UTF8.GetString((Encoding.Convert(Encoding.GetEncoding(codePage2), Encoding.UTF8, bytes)));

当您阅读dbf文件时,您应该了解您应该考虑3种编码类型:

1.数据库提供程序读取文件的编码。这取决于 提供程序和当前操作系统。此编码应用于字节数组接收。例如,在我的电脑上:

  • 当我使用连接字符串“数据源={0}; Provider=Microsoft.JET.OLEDB.4.0;扩展属性=DBase IV;用户 ID=;密码=;”,使用866代码页(俄语)读取字符串 (MS-DOS)

  • 当我使用连接字符串“数据源={0}; Provider=vfpoledb.1;Exclusive=No;排序顺序=Machine”,字符串 使用编码读取。默认值(1