【问题标题】:Delphi xe8 error reading textfile created from Delphi 7 version and vice versaDelphi xe8 错误读取从 Delphi 7 版本创建的文本文件,反之亦然
【发布时间】:2016-01-13 13:39:58
【问题描述】:

我尝试将代码从 Delphi 7 转换为 delphi xe8,但找不到以下情况的解决方案。

我们的旧应用程序创建一个 txt 文件,第一行是这样的

±HEADER―ID°N1799―USER_ID°N1―PATH_NAME―R_DATABASE°TC:\DATA―R_SERVER°TTEST_SRV―R_COMPUTER°TMYPC―

Char(―) 是 chr(175)。

我们尝试使用 Delphi xe8 从我们的新应用程序中读取已经创建的文件,如下所示:

  StrData := TStringList.Create;
  StrData.LoadFromFile(sFile);

StrData.Text 返回所需的文本,但 chr(175) 被替换为 chr(8213)。

为了继续,我做了以下事情:

  StrData.LoadFromFile(sFile,TEncoding.ANSI);  
  StrData.Text := StringReplace(StrData.Text,Chr(8213),Chr(175),[rfReplaceAll]);

我不能解决的是相反的情况。

我必须从 Delphi xe8 创建该文件,以便它与从旧的 delphi 7 应用程序生成的文件完全相同。

一开始我使用了与我们相同的代码:

StrData.SavetoFile(sFile); //returns text but chr(175) is replaced with (?)

我也尝试了所有编码都没有结果。

StrData.SavetoFile(sFile,Ansi);//returns text but chr(175) is replaced with (?) etc.

将代码转换为 TStreamFile 或文本文件时,结果也相同。

base64 编码文件

老一-改正一(StrData.SavetoFile(sFile)) //Delphi 7

wrFIRUFERVLigJVJRMKwTjE4NjbigJVSSUTCsE4zNjHigJVDU0lURV9JRMKwTjHigJVSU0lURV9JRMKwTjEwMeKAlVNTSVRFX0lEwrBOMeKAlVRSTl9EQVRFwrBENDIzODIuNjA2NzkzOTgxNeKAlVVTRVJfSUTCsE4x4oCVUEFUSF9OQU1FwrBUXFxkZWxwaGkyMDEycjJcQkVORUZJVF9URVNUXFBBX09GRklDRV9WU0xcVFJBTlNGRVJcRVhQT1JU4oCVRklMRV9OQU1FwrBUQU5BRDM2MU0udHh04oCVRklMRV9UWVBFwrBO4oCVUENLX1NFTkRFUsKwVEFkbWlu4oCVUENLX05PVEVTwrBU4oCVX1JWX0lEMcKwTuKAlVNWX0lEwrBO4oCVUlZfSUTCsE7igJVSREJfSUTCsE4xMeKAlVNEQl9JRMKwTjEx4oCVUENLX0NOWFTCsFQwMywxNSw3MiwwMOKAlUtFWUlEwrBUezczRDIwMDU3LTM3NTgtNDlDMi05NTlGLTA4QzYxMDY4NEZGNn3igJVGTF9UWVBFwrBOMuKAlUZMX1NUQVRVU8KwTjDigJVTVEFSVF9EVMKwRDQyMzgyLjYwNjQ5MzA1NTbigJVSX1NUQVJUX0RUwrBE4oCVUl9FTkRfRFTCsETigJVSX1VTRVLCsFTigJVSX1BBVEjCsFTigJVTSVpFX1BDS8KwTuKAlVNJWkVfREFUQcKwTuKAlVNJWkVfQVRDSMKwTuKAlVNJWkVfRE9DU8KwTuKAlURBVEVfSU7CsETigJVSX0RBVEFCQVNFwrBU4oCVUl9TRVJWRVLCsFTigJVSX0NPTVBVVEVSwrBU4oCV P>

StrData.SavetoFile(sFile,Tencoding.Ansi); & StrData.SavetoFile(sFile); //XE8

wrFIRUFERVI / SUTCsE4xODY3P1JJRMKwTjM2Mj9DU0lURV9JRMKwTjE / UlNJVEVfSUTCsE4xMDE / U1NJVEVfSUTCsE4xP1RSTl9EQVRFwrBENDIzODIuNzA3NzA4MzMzMz9VU0VSX0lEwrBOMT9QQVRIX05BTUXCsFRcXGRlbHBoaTIwMTJyMlxCRU5FRklUX1RFU1RcUEFfT0ZGSUNFX1ZTTFxUUkFOU0ZFUlxFWFBPUlQ / RklMRV9OQU1FwrBUQU5BRDM2Mk0udHh0P0ZJTEVfVFlQRcKwTj9QQ0tfU0VOREVSwrBUQWRtaW4 / UENLX05PVEVTwrBOP19SVl9JRDHCsE4 / U1ZfSUTCsE4 / UlZfSUTCsE4 / UkRCX0lEwrBOMTE / U0RCX0lEwrBOMTE / UENLX0NOWFTCsFQwMywxNSw3MiwwMD9LRVlJRMKwVHtGQzM1N0QyNC1EQjRBLTRBOUMtQkE3My0xQ0FBMEVFRDUzOUJ9P0ZMX1RZUEXCsE4yP0ZMX1NUQVRVU8KwTjA / U1RBUlRfRFTCsEQ0MjM4Mi43MDcyNjg1MTg1P1JfU1RBUlRfRFTCsEQ / Ul9FTkRfRFTCsEQ / Ul9VU0VSwrBUP1JfUEFUSMKwVD9TSVpFX1BDS8KwTj9TSVpFX0RBVEHCsE4 / U0laRV9BVENIwrBOP1NJWkVfRE9DU8KwTj9EQVRFX0lOwrBEP1JfREFUQUJBU0XCsFQ / Ul9TRVJWRVLCsFQ / Ul9DT01QVVRFUsKwVD8 = P>

StrData.SavetoFile(sFile,Tencoding.UTF8); //XE8

wrFIRUFERVLCr0lEwrBOMTg3MMKvUklEwrBOMzY1wq9DU0lURV9JRMKwTjHCr1JTSVRFX0lEwrBOMTAxwq9TU0lURV9JRMKwTjHCr1RSTl9EQVRFwrBENDIzODIuNzIyODEyNcKvVVNFUl9JRMKwTjHCr1BBVEhfTkFNRcKwVFxcZGVscGhpMjAxMnIyXEJFTkVGSVRfVEVTVFxQQV9PRkZJQ0VfVlNMXFRSQU5TRkVSXEVYUE9SVMKvRklMRV9OQU1FwrBUQU5BRDM2NU0udHh0wq9GSUxFX1RZUEXCsE7Cr1BDS19TRU5ERVLCsFRBZG1pbsKvUENLX05PVEVTwrBOwq9fUlZfSUQxwrBOwq9TVl9JRMKwTsKvUlZfSUTCsE7Cr1JEQl9JRMKwTjExwq9TREJfSUTCsE4xMcKvUENLX0NOWFTCsFQwMywxNSw3MiwwMMKvS0VZSUTCsFR7ODE5REQ0NDQtQzEwQi00MTY1LUFEQjAtQkI2NDAyRjA3NUI4fcKvRkxfVFlQRcKwTjLCr0ZMX1NUQVRVU8KwTjDCr1NUQVJUX0RUwrBENDIzODIuNzIyNTIzMTQ4McKvUl9TVEFSVF9EVMKwRMKvUl9FTkRfRFTCsETCr1JfVVNFUsKwVMKvUl9QQVRIwrBUwq9TSVpFX1BDS8KwTsKvU0laRV9EQVRBwrBOwq9TSVpFX0FUQ0jCsE7Cr1NJWkVfRE9DU8KwTsKvREFURV9JTsKwRMKvUl9EQVRBQkFTRcKwVMKvUl9TRVJWRVLCsFTCr1JfQ09NUFVURVLCsFTCrw == P>

有什么想法吗?

【问题讨论】:

  • 这不是真的。请您对您的文本文件进行base64编码,将其编辑到问题中,让我们看一下。
  • @David Heffernan 抱歉,但我不明白你到底想让我做什么。能不能说的具体点?
  • 看起来很简单。无论您拥有什么文本文件,都可以通过 Base64 编码器运行它,然后在您的问题中分享结果。
  • @ Ken White 在我的例子中,'E' 和 'R' 可以是任何字符。以这种方式替换这个角色对我来说似乎很困难。顺便说一下,这个字符是用 chr(175) 的代码创建的。
  • 我们想看看实际的文件。你所描述的并没有挂在一起。你已经描述了你的文件。如果我们能看到实际的文件,我们可以帮助财产。如果您对其进行 base64 编码,我们将知道我们拥有完全相同的文件。对StringReplace 的调用显然是错误的。

标签: delphi delphi-7 delphi-xe8


【解决方案1】:

Delphi 7 程序保存的文件是 UTF-8 编码的。我解码了您提供的 base64 并在十六进制编辑器中查看它。它看起来像这样:

前两个字节是C2 B1。那是±的UTF-8编码。你可以在这里查看:https://mothereff.in/utf-8

使用LoadFromFile(..., TEncoding.UTF8) 加载文件,使用SaveToFile(..., TEncoding.UTF8) 保存文件。这就是你需要做的。请注意,当您以这种方式保存时,文件中将包含一个 BOM。如果不希望这样做,则可以省略 BOM,如前文所述。

请注意,您必须删除对StringReplace 的调用。这会修改文本并且没有任何用处。您绝对不希望将 U+2015 ― 替换为 U+00AF ¯。

根据这个答案的 cmets,您似乎有一些 Delphi 7 代码产生了 UTF-8 编码的文本,当由 Delphi XE8 执行时,这些代码的行为不正确。由于从 ANSI 到 UTF-16 的变化,这并不奇怪。您将需要重新访问此代码并对其进行适当调整。鉴于只有您拥有此代码,我们不可能说更多。

感觉就像您几乎是随机尝试并希望快速解决问题一样。那是没有生产力的。只有清楚地了解 Unicode 和您的程序,您才能取得进步。你需要退后一步,放慢脚步,填补你的知识空白。

【讨论】:

  • SaveToFile(..., TEncoding.UTF8) 结果到第三个文件的编码与第一个不同。
  • 在这里工作正常。唯一的区别是,当您使用TEncoding.UTF8 保存时,您将获得一个 BOM,而您的原始文件没有 BOM。无论如何,我已经解码了文件并向您展示了编码是什么。我认为下一步是让您掌握这些知识并确保您完全了解正在发生的事情。我们无法为您提供实际程序的细节。
  • 查看问题中的第三个文件,这是您的代码仍然使用StringReplace 修改内容的结果。请阅读我回答的最后一段。
  • 不,不是。我只在加载过程中使用了替换。创建过程完全不同,文件是新的没有修改)
  • 问题是你对 Unicode 或者你的程序做了什么没有很好的理解。例如,您是对文件进行 base64 编码,还是将文本粘贴到窗口中?无论如何,除非你有更多的了解,否则你就是在浪费时间。别猜了。停止使用试错法。花点时间学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多