[英]Error because of quote char after converting file to string with Delphi XE?
在Delphi XE中將文件轉換為字符串時,結果不正確。 有幾個'
字符使結果不正確。 我使用了http://www.delphidabbler.com/codesnip的 UnicodeFileToWideString
和FileToString
和我的代碼:
function LoadFile(const FileName: TFileName): ansistring;
begin
with TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) do
begin
try
SetLength(Result, Size);
Read(Pointer(Result)^, Size);
// ReadBuffer(Result[1], Size);
except
Result := '';
Free;
end;
Free;
end;
end;
Delphi XE和Delphi 6之間的結果不同。 D6的結果正確。 我將其與十六進制編輯器程序的結果進行了比較。
您的輸出是以Delphi調試器的樣式生成的,該調試器使用Delphi自己的字符串文字格式顯示字符串變量。 實際上,德爾福XE 修復了用於從自己的程序產生輸出的功能。 確實是您的Delphi 6輸出不正確。
Delphi字符串文字由撇號之間的一系列可打印字符以及一系列由數字符號和每個字符的數值指定的不可打印字符組成。 為了表示撇號,請將兩個彼此相鄰地寫。 可打印和不可打印的字符系列可以彼此正確書寫; 無需將它們與+
運算符連接在一起。
這是您說的正確輸出的摘錄:
#$12'O)=ù'dlû'#6't
該字符串中有四個單獨的撇號,因此每個撇號都會打開或關閉一系列可打印的字符。 當開始讀取左側的字符串時,我們不一定知道哪個是哪個字符串,因為#
, $
, 1
和2
字符都可以單獨打印。 但是,如果它們表示可打印的字符,則0
, )
, =
和ù
字符位於不可打印的區域中,而這不是。 因此,上面的第一個撇號打開了一個可打印的系列,並且#$12
部分表示代碼18中的字符(十六進制為12)。 ù
是另一個撇號。 由於前一個打開了可打印的字符串,因此該字符串必須將其關閉 。 但是此后的下一個字符是d
,它不是#
,因此不能是不可打印字符代碼的開始。 因此,來自您的Delphi 6代碼的此字符串格式錯誤。
該摘錄的正確版本是這樣的:
#$12'O)=ù''dlû'#6't
現在有三個孤獨的撇號和一組加倍撇號。 來自前一個字符串的有問題的撇號已加倍,表明它是文字上的撇號,而不是可打印字符串結尾的撇號。 可打印系列以dlû
繼續。 然后關閉以插入字符6,然后再次打開t
。 在文件的開頭打開整個字符串的撇號是隱式的 。
您尚未指出要使用什么代碼來產生所顯示的輸出,但這就是問題所在。 它不再存在,並且加載文件的代碼是正確的,因此,需要調試注意的唯一地方是依賴於舊的,錯誤格式的任何代碼。 您仍然可以用Robmil替換代碼,因為它在處理(或不處理)異常和空文件方面表現更好。
實際上,查看實際數據,您的問題是文件存儲的是二進制數據,而不是字符串數據,因此將其解釋為字符串根本無效。 它在Delphi 6中完全起作用的唯一原因是非Unicode Delphi允許您以相同的方式處理二進制數據和字符串。 您不能在Unicode Delphi中執行此操作,也不應該。
從文件中獲取實際文本的解決方案是將文件讀取為二進制數據,然后將來自此二進制數據的所有值(一次為一個字節)復制到字符串(如果它是“有效” Ansi字符(可打印) )。
我會建議代碼:
function LoadFile(const FileName: TFileName): AnsiString;
begin
with TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) do
try
SetLength(Result, Size);
if Size > 0 then
Read(Result[1], Size);
finally
Free;
end;
end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.