如何确定字符(Unicode代码点)是从左到右还是从右到左?

时间:2018-04-27 19:08:16

标签: unicode utf-8

我在下面有一个答案。如果有人有更好的答案,请发表评论。

有人认为可以使用“UnicodeData .... txt”来解决问题 从左到右或从右到左的文本。不幸的是,因为这个列表是按字符进行的 风格,忽视了“块”的概念。换句话说,考虑阿拉伯语或希伯来语块:不是 所有代码点都已定义,但如果在希伯来语块中添加代码点,则显然不是 将成为从左到右的区块中的唯一一个 - 这将是极不可能的。 在交叉引用块名称时,仔细检查所有从右到左的字符 从右到左只有五个字符范围。这五个范围涵盖所有 从右到左的字符块,以及新定义的从右到左的所有字符范围 可能会插入代码点。

我能够确定Unicode 10中存在以下从右到左的块。

value

这是一个优化的C语言比较器宏:最常见的文本将在第一个'> ='处停止。

此宏对于unicode 10中的每个代码点都是正确的,除了:

0590..05FF; Hebrew
0600..06FF; Arabic
0700..074F; Syriac
0750..077F; Arabic Supplement
0780..07BF; Thaana
07C0..07FF; NKo
0800..083F; Samaritan
0840..085F; Mandaic
0860..086F; Syriac Supplement
08A0..08FF; Arabic Extended-A

FB1D..FB4F; Alphabetic Presentation Forms (hebrew part)
FB50..FDFF; Arabic Presentation Forms-A
FE70..FEFF; Arabic Presentation Forms-B

10800..1083F; Cypriot Syllabary
10840..1085F; Imperial Aramaic
10860..1087F; Palmyrene
10880..108AF; Nabataean
108E0..108FF; Hatran
10900..1091F; Phoenician
10920..1093F; Lydian
10980..1099F; Meroitic Hieroglyphs
109A0..109FF; Meroitic Cursive
10A00..10A5F; Kharoshthi
10A60..10A7F; Old South Arabian
10A80..10A9F; Old North Arabian
10AC0..10AFF; Manichaean
10B00..10B3F; Avestan
10B40..10B5F; Inscriptional Parthian
10B60..10B7F; Inscriptional Pahlavi
10B80..10BAF; Psalter Pahlavi
10C00..10C4F; Old Turkic
10C80..10CFF; Old Hungarian

1E800..1E8DF; Mende Kikakui
1E900..1E95F; Adlam
1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols

宏(“levant”这个词对大多数从右到左语言的描述很近):

200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;;

这是一个用于测试宏的Python脚本:

#define IS_LEVANT(c)  ((c) >= 0x00590 && ((c) <= 0x008FF || \
                      ((c) >= 0x0FB1D && ((c) <= 0x0FDFF || \
                      ((c) >= 0x0FE70 && ((c) <= 0x0FEFF || \
                      ((c) >= 0x10800 && ((c) <= 0x10CFF || \
                      ((c) >= 0x1E800 && ((c) <= 0x1EEFF))))))))))

1 个答案:

答案 0 :(得分:0)

Bidi类(https://docs.oracle.com/javase/7/docs/api/java/text/Bidi.html)将分析一个字符数组并指示其中的运行次数(文本为RTL或LTR的部分),运行开始和停止的位置以及运行是否为LTR或RTL