如何在Python 3中将阿拉伯字符转换为其基本字形形式?

问题描述

由于单个阿拉伯字符可以采用多种字形,因此每种格式都有多种unicode / utf-8编码,例如 aleph utf-8==\xD8\xA7 ,其中{ {1}}, Final == ـا utf-8==\xD9\x80\xD8\xA7 Hamza == أ / إ utf-8==\xD8\xA5 / \xD8\xA3 {{1} } Maddah == آ utf-8==\xD8\xA2 Maqsurah == ى,其中基本形式是带有utf-8==\xD9\x89的孤立字母。

如何在Python 3中将阿拉伯字符转换为其基本字形形式?

解决方法

您可以使用unicodedata.normalize将代码点转换为它们的分解形式,包括基本字符和修饰符。它不适用于所有情况(尤其是Maqsurah),但可以帮助您编写确定某些基本形式的函数:

>>> s='ـا' # this character already consisted of the base code point.
>>> import unicodedata as ud
>>> for c in s:
...     print(f'{c} U+{ord(c):04X} {ud.name(c)}')
...     
ـ U+0640 ARABIC TATWEEL
ا U+0627 ARABIC LETTER ALEF

>>> s = 'أإآ' # These characters have decomposed forms
>>> for c in s:
...     print(f'{c} U+{ord(c):04X} {ud.name(c)}')
...     
أ U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE
إ U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW
آ U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE
>>> s = ud.normalize('NFD',s)
>>> for c in s:
...     print(f'{c} U+{ord(c):04X} {ud.name(c)}')
...     
ا U+0627 ARABIC LETTER ALEF
ٔ  U+0654 ARABIC HAMZA ABOVE
ا U+0627 ARABIC LETTER ALEF
ٕ  U+0655 ARABIC HAMZA BELOW
ا U+0627 ARABIC LETTER ALEF
ٓ  U+0653 ARABIC MADDAH ABOVE