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

如何在Python3中将阿拉伯语字符转换为其基本字形形式?,python,unicode,utf-8,arabic,Python,Unicode,Utf 8,Arabic,由于单个阿拉伯字符可以采用多种字形形式,因此每种形式都有多个unicode/utf-8编码,例如Aleph:孤立==اwithutf-8==\xD8\xA7,Final== اwithutf-8==\xD9\x80\xD8\xA7,Hamza==أ/إ带utf-8==\xD8\xA5/\xD8\xA3,Maddah==آ带utf-8=\xD8\xA2,Maqsurah==ى 在Python 3中,如何将阿拉伯语字符转换为其基本字形形式?您可以使用unicodedata.normalize将代码点

由于单个阿拉伯字符可以采用多种字形形式,因此每种形式都有多个unicode/utf-8编码,例如Aleph:
孤立==ا
with
utf-8==\xD8\xA7
Final== ا
with
utf-8==\xD9\x80\xD8\xA7
Hamza==أ/إ
utf-8==\xD8\xA5/\xD8\xA3
Maddah==آ
utf-8=\xD8\xA2
Maqsurah==ى


在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

您可以使用
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

注意:理论上,好的Unicode文本不应使用“glyphs码点”,但当它很重要时(例如在教科书中,或复制非常旧的文本,其中glyph是重要的部分,而不是文本),因此可能不应转换。但是为了与旧编码兼容,您可能会得到不同的形式(旧计算机使用的是更愚蠢的计算机,所以“预渲染”是必要的)。请参阅如何解决此问题的答案,或了解详细信息注意:理论上,好的Unicode文本不应使用“glyphs codepoints”,但在重要的时候(例如,在教科书中,或复制非常旧的文本,其中glyph是重要的部分,而不是文本),因此可能不应转换。但是为了与旧编码兼容,您可能会得到不同的形式(旧计算机使用的是更愚蠢的计算机,所以“预渲染”是必要的)。有关详细信息,请参见如何解决此问题的答案