显示文本时的Unicode字符顺序问题

Unicode character order problem when text is displayed

我正在开发一个应用程序,该应用程序可将文本转换为以自定义字体显示的扩展 ASCII 字符集中的一些其他字符。

程序操作本质上是使用正则表达式解析输入字符串,定位标准字符并输出转换后的字符,然后return使用正确的字体查看带有修改后的文本的字符串才能正确显示。

函数 return 时不时地出现一个字符串,其中字符的显示顺序错误,几乎就像它们已损坏或 Unicode 双倍宽度间距中缺少某些数据一样。我已经检查了二进制输出、十六进制数据,并在我 return 之前检查了函数中的数据,一切看起来都很好,但每隔一段时间就会出现问题,我无法完全理解它。

要了解当我说顺序很奇怪时我的意思的示例,只需查看以下从程序输出的转换文本并尝试用鼠标突出显示它。您会发现它并没有按照您期望的顺序突出显示,尽管它是这样显示的。

有没有人以前见过这样的事情,他们对发生的事情有什么想法吗?

ך┼♫יἯ╡П♪דἰ

您正在混合具有不同 LTR/RTL 特征的各种 Unicode 字符。

LTR 的意思是“从左到右”,是英语(和许多其他西方语言)文本的书写方向。

RTL 是“从右到左”,主要用于阿拉伯语和希伯来语(以及 several other scripts)。

默认情况下,在呈现 Unicode 文本时,引擎将尝试使用字符的方向性来确定给定部分代码的方向。通常这很好用,因为希伯来语单词将只有希伯来语字母,而英语单词将仅使用拉丁字母表中的字母,因此对于每个块都有一个容易猜到的有意义的方向。

但是你混合了来自不同文字和不同方向的字母。

例如 ך 是 U+05DA HEBREW LETTER FINAL KAF,但您还使用了另外两个希伯来字符。您可以使用 this page 之类的东西来列出您使用的 Unicode 字符。

你可以

  1. 不要使用“错误的”方向字母或
  2. 使用 Left-to-right mark character.
  3. 使方向明确

编辑: 最后但同样重要的是:我刚刚意识到你说的是“自定义字体”:如果你希望显示特定的自定义字体,那么你真的应该使用一个Unicode 中的 private use areas:它们 显式 像这样保留供私人使用(即字符 与公开匹配为代码点定义的字形)。这也可以避免像你得到的那样的意外,其中一些使用的字符具有不同的渲染属性。