Delphi xe8错误读取从Delphi 7版本创建的文本文件,反之亦然

时间:2016-01-13 13:39:58

标签: delphi delphi-7 delphi-xe8

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

我们的旧应用程序创建了一个txt文件,第一行就是那个

±HEADER-ID°N1799-USER_ID°N1-路径名-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或textfile时也会产生相同的结果。

base64编码文件

旧的 - 正确的(StrData.SavetoFile(sFile))// Delphi 7

wrFIRUFERVLigJVJRMKwTjE4NjbigJVSSUTCsE4zNjHigJVDU0lURV9JRMKwTjHigJVSU0lURV9JRMKwTjEwMeKAlVNTSVRFX0lEwrBOMeKAlVRSTl9EQVRFwrBENDIzODIuNjA2NzkzOTgxNeKAlVVTRVJfSUTCsE4x4oCVUEFUSF9OQU1FwrBUXFxkZWxwaGkyMDEycjJcQkVORUZJVF9URVNUXFBBX09GRklDRV9WU0xcVFJBTlNGRVJcRVhQT1JU4oCVRklMRV9OQU1FwrBUQU5BRDM2MU0udHh04oCVRklMRV9UWVBFwrBO4oCVUENLX1NFTkRFUsKwVEFkbWlu4oCVUENLX05PVEVTwrBU4oCVX1JWX0lEMcKwTuKAlVNWX0lEwrBO4oCVUlZfSUTCsE7igJVSREJfSUTCsE4xMeKAlVNEQl9JRMKwTjEx4oCVUENLX0NOWFTCsFQwMywxNSw3MiwwMOKAlUtFWUlEwrBUezczRDIwMDU3LTM3NTgtNDlDMi05NTlGLTA4QzYxMDY4NEZGNn3igJVGTF9UWVBFwrBOMuKAlUZMX1NUQVRVU8KwTjDigJVTVEFSVF9EVMKwRDQyMzgyLjYwNjQ5MzA1NTbigJVSX1NUQVJUX0RUwrBE4oCVUl9FTkRfRFTCsETigJVSX1VTRVLCsFTigJVSX1BBVEjCsFTigJVTSVpFX1BDS8KwTuKAlVNJWkVfREFUQcKwTuKAlVNJWkVfQVRDSMKwTuKAlVNJWkVfRE9DU8KwTuKAlURBVEVfSU7CsETigJVSX0RBVEFCQVNFwrBU4oCVUl9TRVJWRVLCsFTigJVSX0NPTVBVVEVSwrBU4oCV

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 =

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

wrFIRUFERVLCr0lEwrBOMTg3MMKvUklEwrBOMzY1wq9DU0lURV9JRMKwTjHCr1JTSVRFX0lEwrBOMTAxwq9TU0lURV9JRMKwTjHCr1RSTl9EQVRFwrBENDIzODIuNzIyODEyNcKvVVNFUl9JRMKwTjHCr1BBVEhfTkFNRcKwVFxcZGVscGhpMjAxMnIyXEJFTkVGSVRfVEVTVFxQQV9PRkZJQ0VfVlNMXFRSQU5TRkVSXEVYUE9SVMKvRklMRV9OQU1FwrBUQU5BRDM2NU0udHh0wq9GSUxFX1RZUEXCsE7Cr1BDS19TRU5ERVLCsFRBZG1pbsKvUENLX05PVEVTwrBOwq9fUlZfSUQxwrBOwq9TVl9JRMKwTsKvUlZfSUTCsE7Cr1JEQl9JRMKwTjExwq9TREJfSUTCsE4xMcKvUENLX0NOWFTCsFQwMywxNSw3MiwwMMKvS0VZSUTCsFR7ODE5REQ0NDQtQzEwQi00MTY1LUFEQjAtQkI2NDAyRjA3NUI4fcKvRkxfVFlQRcKwTjLCr0ZMX1NUQVRVU8KwTjDCr1NUQVJUX0RUwrBENDIzODIuNzIyNTIzMTQ4McKvUl9TVEFSVF9EVMKwRMKvUl9FTkRfRFTCsETCr1JfVVNFUsKwVMKvUl9QQVRIwrBUwq9TSVpFX1BDS8KwTsKvU0laRV9EQVRBwrBOwq9TSVpFX0FUQ0jCsE7Cr1NJWkVfRE9DU8KwTsKvREFURV9JTsKwRMKvUl9EQVRBQkFTRcKwVMKvUl9TRVJWRVLCsFTCr1JfQ09NUFVURVLCsFTCrw ==

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

enter image description here

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

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

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

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

感觉就像你几乎随意地尝试一些事情并希望快速修复一样。那没有效果。只有清楚地了解Unicode和您的程序,才能取得进展。您需要退后一步,放慢速度,填补知识空白。