Delphi:ADOConnection、DBASE3和字符集(bug?)

Delphi:ADOConnection、DBASE3和字符集(bug?),delphi,character-encoding,odbc,ado,dbase,Delphi,Character Encoding,Odbc,Ado,Dbase,DelphiXE3,Win7教授 我需要写入DBASE 3(旧格式)文件,以便为类似DOS的应用程序(Clipper?)导出数据。 好的,我想:MS数据库驱动程序可以做到这一点 但我对匈牙利口音有问题 我尝试了以下连接字符串: Driver={Microsoft dBASE Driver (*.dbf)};DriverID=21;Dbq=c:\temp;Extended Properties=dBASE III;charSet=CP 852;Locale Identifier=1038;Char

DelphiXE3,Win7教授

我需要写入DBASE 3(旧格式)文件,以便为类似DOS的应用程序(Clipper?)导出数据。 好的,我想:MS数据库驱动程序可以做到这一点

但我对匈牙利口音有问题

我尝试了以下连接字符串:

Driver={Microsoft dBASE Driver (*.dbf)};DriverID=21;Dbq=c:\temp;Extended Properties=dBASE III;charSet=CP 852;Locale Identifier=1038;Character Set=CP 852;CODEPAGE=852
正如我看到的,它不能只写ANSI文件(DOS应用程序接受CP852字符)

我试图用AnsiToOEM转换内容,但有些字符在保存时丢失了。在记录中,我看到了良好的内容,但保存的文件包含错误的口音。 测试文本是“árvíztűrőtükörfúrógép”。 结果中缺少“í”、“ó”、“Ó”

我发现了一些奇怪的东西

如果主窗体有一个打开的ADOConnection(在DFM中connected属性为true),那么我将从DBASE文件中读取正确的字符,并将它们写入文件中—ANSI字符将正确转换。“í”没关系,“ó”没关系。 此连接对象可能与读取器不同

如果我在IDE模式下关闭这个连接,打开的文件将不会被转换,因此我将看到一些奇怪的重音字符,并且我不会在文件中写入好的文本

这很奇怪,因为如果我在FormCreate by code上打开此连接,问题就会出现。。。 如果资源拖缆从DFM读取ADOConnection的active(真值)“connected”属性,我可以读取和写入ADOQuery记录

我不知道在后台发生了什么,也不知道如何强制这个ADO字符转换例程工作,但是我浪费了更多的时间来找到一个工作正常的DBASE III导出程序,我只发现了一个类似错误的东西

有人知道这是什么吗?为什么ADO字符编码器/解码器只有在DFM中有连接的ADO连接时才能工作? 或者如何使用ADODB.Connection而不是ADOConnection对象来避免这种副作用


谢谢你的每一个想法

如我所见,我需要设置代码页来修复ADO的字符串

var
  s: string;
  aStr1, aStr2: AnsiString;

begin
...

s := 'árvíztûrõ tükörfúrógép';
aStr1 := s;
SetLength(aStr2, Length(aStr1));
AnsiToOemBuff(PAnsiChar(aStr1), PAnsiChar(aStr2), Length(aStr1));
SetCodePage(RawbyteString(aStr2), 852, False); // THIS IS THE SOLUTION
ADOQuery1.FieldBYName('name').AsAnsiString := aStr2;
否则,我的回答会在后台再次转换