Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 是否替换包含0的字符串?_Delphi_String_Unicode_Delphi 2007_Utf 16 - Fatal编程技术网

Delphi 是否替换包含0的字符串?

Delphi 是否替换包含0的字符串?,delphi,string,unicode,delphi-2007,utf-16,Delphi,String,Unicode,Delphi 2007,Utf 16,我使用此函数将文件读取为字符串 function LoadFile(const FileName: TFileName): string; begin with TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) do begin try SetLength(Result, Size); Read(Pointer(Result)^, Size); except

我使用此函数将文件读取为字符串

function LoadFile(const FileName: TFileName): string;
begin
  with TFileStream.Create(FileName,
      fmOpenRead or fmShareDenyWrite) do begin
    try
      SetLength(Result, Size);
      Read(Pointer(Result)^, Size);
    except
      Result := '';  
      Free;
      raise;
    end;
    Free;
  end;
end;
以下是文件的文本:

version  
以下是LoadFile的返回值:

'ÿþv'#0'e'#0'r'#0's'#0'i'#0'o'#0'n'#0

我想创建一个包含verabc的新文件。问题是我仍然有一个问题要用abc替换sion。我用的是D2007。如果我删除所有0,则结果将变为汉字。

您似乎加载了一个unicode编码的文本文件。0表示拉丁字符

如果不想处理unicode文本,请在保存文件时在编辑器中选择ANSI编码

如果您需要unicode编码,请使用WideCharToString将其转换为ANSI字符串,或者删除0,尽管后者不是最佳解决方案。同时删除2个前导字符,ÿþ。
编辑器将这些字节作为unicode放入文件。

您认为文件的文本实际上不是文件的文本。您在字符串变量中读取的内容是准确的。您有一个编码为little endian UTF-16的Unicode文本文件。前两个字节表示字节顺序标记,其后的每一对字节都是字符串的另一个字符

如果正在读取Unicode文件,则应使用Unicode数据类型,如WideString。在设置字符串长度时,需要将文件大小除以2,并且要放弃前两个字节

如果不知道正在读取的文件类型,则需要先读取前两个或三个字节。如果前两个字节是$ff$fe,如上所述,那么您可能有一个小的endian UTF-16文件;将文件的其余部分读入WideString,如果您有该类型,则读入UnicodeString。如果它们是$fe$ff,那么可能是big endian;将文件的其余部分读入宽字符串,然后交换每对字节的顺序。如果前两个字节为$ef$bb,则检查第三个字节。如果是$bf,那么它们可能是UTF-8字节顺序标记。放弃所有三个,将文件的其余部分读入一个AnsiString或一个字节数组,然后使用UTF8Decode之类的函数将其转换为一个WideString


一旦您的数据位于宽字符串中,调试器将显示它包含版本,并且您应该可以使用启用Unicode的StringReplace版本进行替换。

0表示英语?哪个值表示克林贡语0表示拉丁语?斯泰库西斯…:Rob,我用记事本创建了一个文件,并用版本填充,然后使用上面的函数,我的变量中仍然有unicode字符。这是规定吗?我正在使用D2007&Vista。啊,对不起,我的编辑器有一些问题。我用记事本打开文件,一切都很顺利!!。显然,Vista UTF-16中的默认编码。是时候了。如果确实需要不同的编码,请使用“另存为”对话框并选择不同的编码。在记事本中打开文件时,一切都很顺利,因为它使用了我在回答中描述的过程。它甚至比这还要复杂一点,因为它也考虑了ANSI编码。