2016-01-13 88 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'來修改內容的結果。請在我的答案中閱讀最後一段。 –