簡體   English   中英

Delphi xe8錯誤讀取從Delphi 7版本創建的文本文件,反之亦然

[英]Delphi xe8 error reading textfile created from Delphi 7 version and vice versa

我嘗試將代碼從Delphi 7轉換為delphi xe8,我無法找到以下案例的解決方案。

我們的舊應用程序創建了一個txt文件,第一行就是這樣

±HEADER-ID°N1799-USER_ID°N1-路徑名-R_DATABASE°TC:\\ DATA-R_SERVER°TTEST_SRV-R_COMPUTER°TMYPC-

字符( - )是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

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

==

有任何想法嗎?

Delphi 7程序保存的文件是UTF-8編碼的。 我解碼了你提供的base64並在十六進制編輯器中查看它。 它看起來像這樣:

在此輸入圖像描述

前兩個字節是C2 B1 這是±的UTF-8編碼。 您可以在此處查看: https//mothereff.in/utf-8

使用LoadFromFile(..., TEncoding.UTF8)加載文件,使用SaveToFile(..., TEncoding.UTF8)保存文件。 這就是你需要做的。 請注意,以這種方式保存時,BOM將包含在文件中。 如果不需要,則可以省略BOM,如前所述。

請注意,您必須刪除對StringReplace的調用。 這會修改文本並沒有用處。 你絕對不希望用U + 00AF取代U + 2015

根據對此答案的評論,您似乎有一些Delphi 7代碼生成了UTF-8編碼的文本,這些文本在Delphi XE8執行時表現不正確。 由於從ANSI到UTF-16的變化,這並不奇怪。 您需要重新訪問此代碼並進行適當調整。 鑒於只有你擁有這個代碼的事實,我們不可能多說。

感覺就像你幾乎隨意地嘗試一些東西並希望快速修復一樣。 那沒有效果。 只有清楚地了解Unicode和您的程序,才能取得進展。 您需要退后一步,放慢速度,填補知識空白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM