2016-01-13 89 views
1

我尝试将Delphi 7的代码转换为德尔福XE8,我无法找到解决方案,以下情况。德尔福XE8错误阅读从德尔福7版本创建的文本文件,反之亦然

我们的老应用程序创建一个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))//德尔福7

wrFIRUFERVLigJVJRMKwTjE4NjbigJVSSUTCsE4zNjHigJVDU0lURV9JRMKwTjHigJVSU0lURV9JRMKwTjEwMeKAlVNTSVRFX0lEwrBOMeKAlVRSTl9EQVRFwrBENDIzODIuNjA2NzkzOTgxNeKAlVVTRVJfSUTCsE4x4oCVUEFUSF9OQU1FwrBUXFxkZWxwaGkyMDEycjJcQkVORUZJVF9URVNUXFBBX09GRklDRV9WU0xcVFJBTlNGRVJcRVhQT1JU4oCVRklMRV9OQU1FwrBUQU5BRDM2MU0udHh04oCVRklMRV9UWVBFwrBO4oCVUENLX1NFTkRFUsKwVEFkbWlu4oCVUENLX05PVEVTwrBU4oCVX1JWX0lEMcKwTuKAlVNWX0lEwrBO4oCVUlZfSUTCsE7igJVSREJfSUTCsE4xMeKAlVNEQl9JRMKwTjEx4oCVUENLX0NOWFTCsFQwMywxNSw3MiwwMOKAlUtFWUlEwrBUezczRDIwMDU3LTM3NTgtNDlDMi05NTlGLTA4QzYxMDY4NEZGNn3igJVGT F9UWVBFwrBOMuKAlUZMX1NUQVRVU8KwTjDigJVTVEFSVF9EVMKwRDQyMzgyLjYwNjQ5MzA1NTbigJVSX1NUQVJUX0RUwrBE4oCVUl9FTkRfRFTCsETigJVSX1VTRVLCsFTigJVSX1BBVEjCsFTigJVTSVpFX1BDS8KwTuKAlVNJWkVfREFUQcKwTuKAlVNJWkVfQVRDSMKwTuKAlVNJWkVfRE9DU8KwTuKAlURBVEVfSU7CsETigJVSX0RBVEFCQVNFwrBU4oCVUl9TRVJWRVLCsFTigJVSX0NPTVBVVEVSwrBU4oCV

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

这不符合规定。请你可以base64编码你的文本文件,编辑成问题,让我们看看它。 –

+0

@ David Heffernan对不起,但我不明白你要我做什么。你能更具体吗? –

+0

似乎很简单。无论您使用哪种文本文件,都可以通过Base64编码器运行,并在您的问题中分享结果。 –

回答

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和程序的情况下才能取得进展。你需要退后一步,放慢速度,填补知识空白。

+0

SaveToFile(...,TEncoding.UTF8)结果到第三个编码的文件,它与第一个文件不一样。 –

+0

在这里可以正常工作。唯一的区别是,当你使用'TEncoding.UTF8'保存时,你会得到一个BOM,而你的原始文件没有BOM。无论如何,我已经解码了这些文件并向您显示了编码的内容。我认为下一步是让你了解这些知识并确保你完全理解正在发生的事情。您的实际计划的细节不是我们可以帮助您的。 –

+0

看看你的问题中的第三个文件,这是你的代码仍然使用'StringReplace'来修改内容的结果。请在我的答案中阅读最后一段。 –