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

时间:2014-10-02 20:49:06

标签: delphi character-encoding odbc ado dbase

Delphi XE3,Win7教授

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

但我对匈牙利口音有疑问。

我尝试了这个连接字符串:

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字符将被正确转换。 “í”没关系,“ó”没问题。 此ADOConnection对象可能与读者不同。

如果我在IDE模式下关闭此ADOConnection,打开的文件将不会被转换,所以我会看到一些奇怪的重音字符,我不会在文件中写好文字。

很奇怪,因为如果我通过代码在FormCreate上打开这个连接,问题就会出现...... 如果资源流媒体从DFM读取ADOConnection的活动(真值)“已连接”属性,我可以读取和写入ADOQuery记录!

我不知道后台发生了什么,以及如何强制这个ADO角色转换例程工作,但是我浪费了更多的时间来找到一个工作的DBASE III导出器,而且我发现只有类似bug的东西......

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

感谢您的每一个想法!

1 个答案:

答案 0 :(得分:0)

我认为我需要设置代码页来修复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;

否则会在后台再次转换我的AnsiString。