java - 为什么 Unicode u+202e 和 u+202c 会导致输出文本有不同的结果

标签 java unicode

在 Java 中:

  • 如果我打印 "123\u202e987\u202c456abc" 那么结果是 123987456abc

  • 如果我打印 "123\u202e987\u202cxyzabc" 那么结果是 123987xyzabc

您会看到,当要打印的字符串中的“456”更改为“xyz”时,输出序列不同。

这是如何工作的?

最佳答案

TLDR:出现您所看到的效果是因为 Unicode 算法对数字和字母字符的处理方式不同,该算法确定包含格式控制字符的文本的呈现。

对于您正在显示的文本:

  • \u202eRIGHT-TO-LEFT OVERRIDE (RLO) 字符。
  • \u202cPOP DIRECTIONAL FORMATTING (PDF) 字符。
  • 两者都是 Unicode 格式的控制字符,它们的唯一作用是影响输出文本的外观。
  • 在您的示例中,RLO 字符指定后面的文本将从右向左显示 (RLO),而 PDF 字符取消(“弹出”)RLO 的效果。

这解释了为什么示例中的文本 123\u202e987\u202cxyzabc 呈现为 123987xyzabc。 RLO (\u202e) 导致后面的文本按从右到左的顺序呈现(因此 987 显示为 789),并且 PDF (\u202c) 终止反转后续文本。

但它并没有解释为什么 123\u202e987\u202c456abc 呈现为 123456789abc。根据这个参数,预期输出应该是 123789456abc。

用于确定此类场景中的输出的算法非常复杂,但其中一个因素是所渲染的字符的方向性。字母字符的方向性较强,而数字(即数字字符)的方向性较弱。有关完整详细信息,请参阅 Unicode 文档 Unicode® Standard Annex #9 UNICODE BIDIRECTIONAL ALGORITHM ,特别是 3.3.4 Resolving Weak Types 部分

该文档 provides an example similar to yours 的文本包含 RIGHT-TO-LEFT EMBEDDING (RLE) 字符(而不是 RLO),后面跟着一个 PDF 和一些包含数字的尾随文本:

Memory: it is called "[RLE]AN INTRODUCTION TO java[PDF]" - $19.95 in hardcover.

Display: it is called "$19.95 - "java OT NOITCUDORTNI NA in hardcover.

请注意,在他们的示例中,移动的不仅仅是数字。美元符号和句点也是如此,因为文本 $19.95 中的所有六个字符都具有弱方向性。

注释:

关于java - 为什么 Unicode u+202e 和 u+202c 会导致输出文本有不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72051853/

相关文章:

winapi - CreateWindowExA 将常规字符串解释为 Unicode,在标题中显示中文字符

java - 带有 ContextMenu 的 ViewPager 每个 View 都不同

java - 在eclipse中将Servlet连接到MySQL数据库

json - json解析器和编码器应该如何处理转义的unicode?

android - 我想将 android 通知标题和内容更改为另一种语言(更改为 "Sinhala")我该怎么做?

Python:从非 BMP unicode 字符中查找等效代理对

java - Camel : Read and Write from the same directory

java - 使用 Guice Servlet 测试项目 : How to bind out-of-scope RequestScoped instances?

java - 策略-按接口(interface)类型自动注册

python - “unicode”对象不可调用