如何判断Unicode码点字符是左至右还是右至左方向?
如何判断Unicode码点字符的左至右/右至左方向?
刚好之前研究过这个问题,分享下我的经验和踩过的坑:
一开始我也想直接用UnicodeData.txt来判断字符的方向属性,但实际用起来才发现这条路走不通——因为这个文件是按单个已定义字符来记录属性的,完全忽略了Unicode“块(block)”的概念。举个例子:阿拉伯语或希伯来语这类整体偏向右至左的字符块里,并非所有码点都已经被单独定义,但只要是这个块里新增的码点,几乎不可能是块里唯一的左至右字符,用UnicodeData.txt根本覆盖不到这类未单独定义的码点。
那更靠谱的方案是什么呢?给大家几个实用的思路:
参考官方的
DerivedBidiClass.txt数据集:这个文件是Unicode官方派生的双向属性表,会覆盖所有码点(包括那些未在UnicodeData.txt里单独定义的块内码点),每个码点都会被标注明确的双向类别:L:左至右字符R/AL:右至左字符(AL特指阿拉伯字母类)- 还有中性类(比如
N标点、WS空格),这类字符的方向由上下文决定
用编程语言的内置工具直接获取:很多主流语言都封装了Unicode双向属性的判断:
- Python:用
unicodedata模块的bidirectional()方法,比如unicodedata.bidirectional('א')返回'R',unicodedata.bidirectional('A')返回'L' - JavaScript:可以借助
Intl相关API,或者用成熟的第三方库(比如unicode-bidi)来简化判断逻辑 - Java:通过
Character.getDirectionality()方法获取字符的方向属性值
- Python:用
另外要注意:如果是判断一段文本的整体显示方向,而不是单个字符,那还得结合Unicode双向算法(Bidi Algorithm)来计算,因为中性字符的方向会受周围字符影响。
内容的提问来源于stack exchange,提问作者Abbey Road
相关产品推荐
相关产品推荐

