[英]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.