Ina*_*Ira 0 delphi string unicode utf-16 delphi-2007
我使用此函数将文件读取到字符串
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;
Run Code Online (Sandbox Code Playgroud)
这是文件的文字:
version
Run Code Online (Sandbox Code Playgroud)
这是LoadFile的返回值:
'ÿþv'#0'e'#0'r'#0's'#0'i'#0'o'#0'n'#0
Run Code Online (Sandbox Code Playgroud)
我想创建一个包含"verabc"的新文件.问题是我仍然有问题用"abc"替换"sion".我正在使用D2007.如果我删除所有#0,那么结果将成为中文字符.
你认为文件的文本实际上不是文件的文本.您在字符串变量中读到的内容是准确的.您有一个Unicode文本文件编码为little-endian UTF-16.前两个字节表示字节顺序标记,之后的每对字节是字符串的另一个字符.
如果您正在读取Unicode文件,则应使用Unicode数据类型,例如WideString
.在设置字符串的长度时,您需要将文件大小除以2,并且您将要丢弃前两个字节.
如果你不知道你正在读什么类型的文件,那么你需要先读取前两个或三个字节.如果前两个字节是$ ff $ fe,如上所述,那么你可能有一个小端UTF-16文件; 读取文件的其余部分WideString
,或者UnicodeString
如果您有该类型.如果它们是$ fe $ ff,那么它可能是大端的; 将文件的其余部分读入a WideString
然后交换每对字节的顺序.如果前两个字节是$ ef $ bb,则检查第三个字节.如果它是$ bf,那么它们可能是UTF-8字节顺序标记.丢弃所有三个并将文件的其余部分读入一个AnsiString
或一个字节数组,然后使用类似的函数UTF8Decode
将其转换为WideString
.
一旦将数据放入a中WideString
,调试器就会显示它包含的数据version
,并且使用启用Unicode的版本进行StringReplace
替换时应该没有问题.
归档时间: |
|
查看次数: |
2854 次 |
最近记录: |