gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:54:01 25 4
gpt4 key购买 nike

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 中的连接属性为 true),那么我将从 DBASE 文件中读取好的字符,并且可以将它们写入文件 - ANSI 字符将被正确转换。 “í”可以,“ó”也可以。此 ADOConnection 对象可能与读取器不同。

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

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

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

有人知道这是什么吗?为什么 ADO 字符编码器/解码器仅当我在 DFM 中连接了 ADOConnection 时才工作?或者我如何使用 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;

否则,某些东西会在后台再次转换我的 AnsiString。

关于Delphi:ADOConnection、DBASE3 和字符集(错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26169419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com