gpt4 book ai didi

string - 为什么将字符串保存到文件的方式会影响结果

转载 作者:行者123 更新时间:2023-12-03 18:18:27 26 4
gpt4 key购买 nike

我在将包含德语字母的字符串保存到 txt 文件时遇到了问题。MCVE 看起来像这样:

procedure TForm1.Button1Click(Sender: TObject);
var
s: string; //alias for UnicodeString
tf: textfile;
ms: tmemorystream;
begin
s := 'ßüÜöÖäÄФфшШ';
assignfile(tf, 'b:\tmp.txt');
Rewrite(tf);
write(tf, s);
closefile(tf);
ms := tmemorystream.Create;
try
ms.WriteBuffer(Pointer(s)^, Length(s) * SizeOf(s[Low(s)]));
ms.Position := 0;
ms.SaveToFile('b:\tmp2.txt');
finally
ms.Free;
end;
end;

如果将字符串直接保存到文件中,我们将得到以下内容:tmp.txt?uUoOaAФфшШ。尽管保留了西里尔字母,但德文字母已更改。如果字符串由 TMemoryStream 保存,结果是正确的:tmp2.txtßüÜöÖäÄÄФфшШ。这是什么原因?

附加

我决定为以不同方式保存的给定字符串添加十六进制值:

对于Write方法:

data: array[0..10] of byte = (
$3F, $75, $55, $6F, $4F, $61, $41, $D4, $F4, $F8, $D8
);

对于 AssignFile(tf, 'b:\tmp.txt',CP_UTF8); 之后调用的 Write 方法;:

data: array[0..21] of byte = (
$C3, $9F, $C3, $BC, $C3, $9C, $C3, $B6, $C3, $96, $C3, $A4, $C3, $84, $D0, $A4,
$D1, $84, $D1, $88, $D0, $A8
);

对于TMemoryStream:

data: array[0..21] of byte = (
$DF, $00, $FC, $00, $DC, $00, $F6, $00, $D6, $00, $E4, $00, $C4, $00, $24, $04,
$44, $04, $48, $04, $28, $04
);

对于 TStringList:

data: array[0..27] of byte = (
$FF, $FE, $DF, $00, $FC, $00, $DC, $00, $F6, $00, $D6, $00, $E4, $00, $C4, $00,
$24, $04, $44, $04, $48, $04, $28, $04, $0D, $00, $0A, $00
);

附加

根据@Remy-Lebeau 的宝贵建议:此方法生成一个 25 字节长的文件。它与在 AssignFile(tf, 'b:\tmp.txt',CP_UTF8); 之后调用的 Write 方法生成的 HEX 类似,带有额外的 3 个字节(BOM?)。

data: array[0..24] of byte = (
$EF, $BB, $BF, $C3, $9F, $C3, $BC, $C3, $9C, $C3, $B6, $C3, $96, $C3, $A4, $C3,
$84, $D0, $A4, $D1, $84, $D1, $88, $D0, $A8
);

最佳答案

要使用 Write/WriteLn 过程将 unicode 字符串存储在文本文件中,您必须首先分配适当的代码页:

AssignFile(tf, 'b:\tmp.txt',CP_UTF8);

要针对不同的区域设置保存文件,您也可以在文件中首先放置 BOM:

Write(tf, #$FEFF);  // An utf8 BOM

关于string - 为什么将字符串保存到文件的方式会影响结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32294631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com