使用Delphi XE将文件转换为字符串后出现引号字符错误?

使用Delphi XE将文件转换为字符串后出现引号字符错误?,delphi,unicode,file-io,delphi-xe,Delphi,Unicode,File Io,Delphi Xe,在Delphi XE中将文件转换为字符串时,结果不正确。有几个“字符”使结果不正确。我使用了Unicode DefileToWideString和FileToString以及我的代码: function LoadFile(const FileName: TFileName): ansistring; begin with TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) do begin t

在Delphi XE中将文件转换为字符串时,结果不正确。有几个“字符”使结果不正确。我使用了Unicode DefileToWideString和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的结果是正确的。我已经将结果与十六进制编辑器程序进行了比较。

我建议使用以下代码:

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;

您的输出是以Delphi调试器的样式生成的,该调试器使用Delphi自己的字符串文本格式显示字符串变量。无论您使用什么函数从自己的程序生成输出,Delphi XE实际上都已修复。实际上,您的Delphi6输出是不正确的

Delphi字符串文字由一系列撇号之间的可打印字符和一系列由数字符号和每个字符的数值指定的不可打印字符组成。要表示撇号,请将两个撇号相邻书写。可打印和不可打印的字符系列可以直接写入,而不是相互写入;不需要将它们与+运算符连接起来

以下是您所说的正确输出的摘录:

$12'O=ù'dlā'6't

该字符串中有四个单独的撇号,因此每个撇号打开或关闭一系列可打印字符。当我们开始读取左边的字符串时,我们不一定知道哪个是哪个,因为、$、1和2个字符都可以自己打印。但是,如果它们表示可打印字符,那么0、=、和ù字符就位于不可打印区域中,这是不可能的。因此,上面的第一个撇号将打开一个可打印的系列,$12部分表示十六进制代码18-12处的字符。ù后面是另一个撇号。因为上一个打开了一个可打印的字符串,所以这个必须关闭它。但其后的下一个字符是d,它不是,因此不能作为不可打印字符代码的开头。因此,Delphi6代码中的这个字符串格式错误

该摘录的正确版本如下:

$12'O=ùdlā6't

现在有三个单撇号和一组双撇号。前一个字符串中有问题的撇号已加倍,表明它是文字撇号,而不是可打印的字符串。可打印系列继续使用dlā。然后它关闭以插入第6个字符,然后再次为t打开。在文件开头打开整个字符串的撇号是隐式的


您没有指出要使用什么代码来生成所显示的输出,但这就是问题所在。它已经不存在了,加载文件的代码是正确的,因此需要您注意调试的唯一地方是任何依赖于旧的、不正确的格式的代码。您最好还是用替换代码,因为它在处理或不处理异常和空文件方面做得更好。

实际上,从实际数据来看,您的问题是文件存储的是二进制数据,而不是字符串数据,因此将其解释为字符串根本无效。它在Delphi6中工作的唯一原因是非Unicode Delphi允许您以相同的方式处理二进制数据和字符串。在Unicode Delphi中不能这样做,也不应该这样做


从文件中获取实际文本的解决方案是将文件作为二进制数据读取,然后从该二进制数据中复制任何值,每次一个字节,如果一个字符串是有效的Ansi字符可打印,则将其转换为字符串。

我完全不理解这个问题,但我知道您不能像现在这样释放一个对象两次。是的,很抱歉。我也不明白这个问题。你能举一个输入文件、预期输出和实际输出的例子吗?你在哪里看到撇号?你能给我们看一下调用这个函数的代码吗?我还想指出,AnsiString从来都不是存储二进制文件内容的理想选择,但从Delphi 2009开始,它是一个糟糕的选择,因为Delphi在分配字符串变量时会进行代码页转换。如果你想保存一个文件的内容,可以使用一个字节数组,比如TBytes,或者直接把它加载到TMemoryStream中。为什么?尽管不可否认,这是一个比原代码更好的代码,但您能否解释一下,为什么您认为这段代码能够真正解决问题?也许你也可以解释一下这个问题,因为我不明白它是什么。为什么?因为它在异常处理方面工作正常。问题可能在于读取非ANSI文本文件。因此,结果有一个不可读的字符串?只是为了澄清代码不会生成与我的代码相同的代码,因为您的代码不能读取非ANSI代码,并且结果中仍然有撇号。是的,它可以正确处理异常。但是你有什么理由这么想呢
这里的问题是什么?非Ansi文本文件不会导致异常。如何验证字符串?评估/修改?然后,根据Delphi语法,文本中会出现双撇号。谢谢,你的解释很好。不知何故,我的输入文件出现了意外问题,所以我对结果感到困惑。无论如何,我已经完成了我想做的转换:binary file=>ansistring=>hex字符串,将hex字符串与我的delphi6模式匹配。