如何制作包含阿拉伯语变音符号的字典作为 python 中的键

How to make a dictionary that contains an Arabic diacritic as a key in python

我正在尝试制作一个程序,将阿拉伯语变音符号和字母转换为拉丁文字。这些字母在程序中运行良好,但变音符号无法转换,因为我每次 运行 程序时都会出错。

一开始,我把变音符号单独作为键,但这对我不起作用。请看最后一个键,它包含 َ ,这是一个变音符号,但不能正常工作,因为字母:

def convert(lit):
    ArEn = {'ا':'A', 'ل':'L', "و": "W", "َ":"a"}
    end_word=[]
    for i in range(len(lit)):
        end_word.append(ArEn[lit[i]])
        jon = ""

    print(jon.join(end_word))

convert("الوَ")

然而,我试图通过使用带有变音符号的字母作为键来解决这个问题,但程序导致了同样的错误:

词典:

ArEn = {'ا':'A', 'ل':'L', "وَ":"Wa"}

错误:

    Traceback (most recent call last):
  File "C:\Users\Abdulaziz\Desktop\converter AR to EN SC.py", line 10, in <module>
    convert("الوَ")
  File "C:\Users\Abdulaziz\Desktop\converter AR to EN SC.py", line 5, in convert
    end_word.append(ArEn[lit[i]])
KeyError: 'و'

更新:多年后我才注意到,字母和变音符号是在第一次尝试时放在一起的。当我把它们分开时,程序就开始工作了。

我刚刚解决了这个问题! 我不太确定这是 python 中的错误还是其他什么,但据我所知 python 对阿拉伯语的支持不是很好。或者是我上面的程序出了问题

我一直在写同一个程序,突然间它工作得很好。 我什至添加了不同的变音符号,它们工作正常。

    def convert(lit):
    ArEn = {'ا':'A', 'ل':'L', "و":"W", "َ":"a", "ُ":"w", "":""}
    end_word=[]
    for i in range(len(lit)):
        end_word.append(ArEn[lit[i]])
        jon = ""

    print(jon.join(end_word))

convert("اُلوَ")

结果是

AwLWa

您用于编码 Python 的程序代码编辑器中可能存在错误,而不是 Pyhton 本身存在错误。 由于您使用的是 Python-3.x,从 运行 程序的角度来看,变音符号只是一个字符,与其他任何字符一样,应该没有任何问题。

从cod-editor的角度来看,存在显示某些特殊unicode字符时是否前进一个字符等问题,也许"字符本身可以显示出来space - 当一个人试图手动更正 " 的位置时,可能会把它弄乱,把特殊字符实际上留在引号字符串之外 -

您可以通过重新编辑文件来解决问题这一事实表明确实发生了这种情况。

避免这种情况的一种方法是放置某些特殊字符 - 特别是具有不同显示规则的字符,然后使用 "\uxxxx" unicode 代码点 unicode 序列进行转义。这将避免您自己或其他人在将来再次编辑您的文件时遇到问题,因为即使我现在可以使用它,编辑器在打开它们时也可能会错误地显示,并且通过尝试修复它可能会再次破坏语法.

您可以使用网络上的table或Python3的交互式提示来获取每个字符的unicode代码点,确保程序的代码部分以确定的方式在任何情况下显示编辑器 -(如果你在同一行添加变音字符作为注释,它实际上会增强代码的可读性 - 如果它应该由非阿拉伯语人士编辑的话会大大提高)

所以,你上面的声明,我使用这个片段来提取代码点:

>>> ArEn = {'ا':'A', 'ل':'L', "و": "W", "َ":"a"}
>>> [print (hex(ord(yy)), yy ) for yy in ArEn.keys()]

0x648 و
0x644 ل
0x64e َ
0x627 ا

这让我可以像这样声明字典:

ArEn = {
 "\u0648": "W",    # و
 "\u0644": "L",    # L
 "\u064e": "a",    #  ۮ
 "\u0627": "A",   # ا
}

(是的,我在终端上显示字符时遇到了问题,就像我说的,您在获取这些字符时可能在编辑器上遇到过 - fatha ("\u064e" - "a") 字符很棘手! :-))

在您的代码中使用代码点的替代方法是使用 Python 的 unicode 数据模块来发现并使用实际的字符名称 - 这可以进一步提高可读性,也许通过探索 unicodedata 你会发现你甚至不必手动创建这个字典,而是使用那个模块 -

In [16]: [print("\u{:04x} - '{}' - {}".format(ord(yy), unicodedata.name(yy),  yy) ) for yy in ArEn.keys()]
\u0648 - 'ARABIC LETTER WAW' - و
\u0644 - 'ARABIC LETTER LAM' - ل
\u064e - 'ARABIC FATHA' - َ
\u0627 - 'ARABIC LETTER ALEF' - ا

从这些全文名称中,您可以使用 unicodedata.lookup 函数返回字符:

>>> unicodedata.lookup("ARABIC LETTER LAM")
 'ل'

备注: 1) 这需要 Python3 - 对于 Python2 可能会尝试在每个字符串前加上 u"" - 但是使用 Python 3 更好地处理这些字符,因为 unicode 支持是它的一大亮点。 2) 这还需要一个使用 "utf-8" 编码很好地支持 unicode 字符的终端 - 我在 Linux 系统上使用 "konsole" 终端。在 Windows 上,idle Python 提示可能有效,但 cmd Python 提示无效。

您可能需要在 python 中适当缩进:

def convert(lit):
    ArEn = {'ا':'A', 'ل':'L', "و":"W", "َ":"a", "ُ":"w", "":""}
    end_word=[]
    for i in range(len(lit)):
        end_word.append(ArEn[lit[i]])
        jon = ""

    print(jon.join(end_word))

convert("اُلوَ")