RichEdit 忽略了不间断的空间

Posted

技术标签:

【中文标题】RichEdit 忽略了不间断的空间【英文标题】:RichEdit neglects non-breaking space 【发布时间】:2021-06-18 14:41:35 【问题描述】:

我尝试将包含不间断空格 (Unicode U+00A0) 的文本添加到具有属性 Wordwrap = True 的 RichEdit。我使用以下代码:

RichEdit.Lines.Add('Some text some text some text 1000' + #160 + 'km some text');

这在 '1000' 和 'km' 之间给出了一个空格,但它不是不间断的:当更改 RichEdit 的宽度时,此处可能会出现换行符,就像使用常规空格一样。我有 Windows 10 2004 版。

是我做错了什么,还是 RichEdit 组件的一般限制?

【问题讨论】:

这确实会在 1000 和 km 之间放置一个 U+00A0;如果我在运行时从 Rich Edit 控件复制文本,我可以看到它。但是,您使用TRichEdit 包装器获得的 Rich Edit 控件版本是一个非常旧的版本,我怀疑它不支持 nbsp。你试过***.com/questions/26960672/…吗? 不,那没用。 你可以看一下OS控件的文档,看看有没有发现什么有趣的东西:docs.microsoft.com/en-us/windows/win32/controls/… Delphi 10.3 仍然使用旧的 RichEdit 2.0。 fgaillard.com/2010/09/using-richedit-4-1-with-d2010 描述了如何使用较新的 RichEdit 4.1 的方法。但是,这无济于事,因为 RichEdit 4.1 仍然忽略不间断空格。 docs.microsoft.com/en-us/windows/win32/controls/… 的文档没有提到对不间断空格的任何支持。所以,这似乎是 RichEdit 组件的一般限制。 我也尝试使用 4.1(它确实有效——例如,我能够显示精美的表格)并且可以确认仅升级不会使 nbsp 工作。但是,我注意到 nbsp 在写字板中工作,所以可能还有办法。例如,docs.microsoft.com/en-us/windows/win32/controls/… 可能值得研究,至少如果您只使用英语(或至少基于拉丁语)文本。 【参考方案1】:

我发现实现此目的的最佳方法是使用一个将不间断空格替换为隐藏字符的过程:

procedure TForm1.AddLine(txt : string);
var
  OrigColour : TColor;
  p : integer;
begin
  p := Pos(#160, txt);

  if p > 0 then
  begin
    OrigColour := RichEdit1.Font.Color;
    RichEdit1.SelText := Copy(txt, 0, p-1);
    RichEdit1.SelAttributes.Color := RichEdit1.Color;
    RichEdit1.SelText := 'o';
    RichEdit1.SelAttributes.Color := OrigColour;
    RichEdit1.SelText := Copy(txt, p+1, Length(txt) - (p)) + #13;
  end
  else
    RichEdit1.Lines.Add(txt);
end;

然后你可以像这样使用它:

  AddLine('Some text some text some text 1000' + #160 + 'km some text');

这将停止在没有 '1000' 的情况下进行 'km' 换行。

我在示例中使用了小写的“o”。避免使用下划线或连字符等,因为它们是换行会中断的字符。

我的解决方案可以很好地显示文本,但如果你打算对它做一些事情,你可能需要去掉所有隐藏的字符。

如果您突出显示文本,隐藏的字符也会显示出来。

【讨论】:

以上是关于RichEdit 忽略了不间断的空间的主要内容,如果未能解决你的问题,请参考以下文章

Apache POI 异常空白(已解决:\u00A0 不间断空格)

在没有焦点的情况下滚动RichEdit

如何在MFC中使用richedit控件_RICHEDIT_VER over 2.1

RichEdit 各个版本介绍

delphi richedit

RichEdit 控件在切换选项卡时不显示水平滚动条