【发布时间】:2023-02-11 02:11:01
【问题描述】:
我有一个包含 Linux 风格换行符的字符串。 Linux 风格是#13,而 Windows 风格是#13#10。
我想在TMemo 中显示这个字符串。看起来 TMemo 只接受 Windows 样式并且不将 #13 视为新行。
TMemo 格式化新行的唯一方法是插入#10,或者我可以以某种方式要求TMemo 以 Linux 风格行事吗?
【问题讨论】:
我有一个包含 Linux 风格换行符的字符串。 Linux 风格是#13,而 Windows 风格是#13#10。
我想在TMemo 中显示这个字符串。看起来 TMemo 只接受 Windows 样式并且不将 #13 视为新行。
TMemo 格式化新行的唯一方法是插入#10,或者我可以以某种方式要求TMemo 以 Linux 风格行事吗?
【问题讨论】:
实际上 Linux 风格是#10,而不是#13(#13 是 MacOS 风格,AFAIK)。另外,请注意它是#10 而不是#$10(#16)。
最简单的方法是在加载/保存时替换行尾,即。代替
Memo.Lines.LoadFromFile(FileName)
or
Memo.Lines.Text := STR;
做
uses System.IOUtils;
Memo.Lines.Text := TFile.ReadAllText(FileName,TEncoding.UTF8).Replace(#13#10,#13).Replace(#10,#13).Replace(#13,#13#10)
or
Memo.Lines.Text := STR.Replace(#13#10,#13).Replace(#10,#13).Replace(#13,#13#10)
而不是
Memo.Lines.SaveToFile(FileName)
or
STR := Memo.Lines.Text
做
uses System.IOUtils;
TFile.WriteAllText(Memo.Lines.Text.Replace(#13#10,#13),TEncoding.UTF8)
or
STR := Memo.Lines.Text.Replace(#13#10,#13)
当然,您应该将 TEncoding.UTF8 替换为您要使用的适当编码。
【讨论】:
TMemo.Lines.Text 时,它会在内部将所有样式的换行符调整为 #13#10,然后将 WM_SETTEXT 消息发送到底层窗口。
我想在备忘录中显示这个字符串。看起来 Memo 只接受 Windows 样式并且不将 #$13 视为新行。
这取决于您如何将
string提供给备忘录。
TMemo包裹的底层Win32EDIT控件内部只支持#13#10风格的换行符。如果将
string分配给TMemo.Text属性,它只会将string原样传递给底层 Win32 控件。因此,string将只需要使用 Windows 风格的换行符。但是,如果您将
string赋给TMemo.Lines.Text属性,它会在内部将所有样式的换行符调整为Windows 样式,然后将调整后的string交给Win32 控件。因此,在这方面,您可以平等地处理 Linux 风格和 Windows 风格的换行符。或者,
TStringList类支持解析所有样式的换行符(当它的LineBreak属性与sLineBreak常量匹配时,它默认这样做)。因此,另一种选择是首先将string分配给TStringList.Text属性,然后您可以将结果列表分配给TMemo.Lines属性。
【讨论】: