如何在python中创建一个包含阿拉伯语变音符号的字典作为键

问题描述 投票:1回答:3

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

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

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-3.x dictionary diacritics arabic-support
3个回答
1
投票

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

从编码编辑的角度来看,存在诸如是否在显示某些特殊的unicode字符时推进一个字符的问题,也许"字符本身可以显示在空间之外 - 当人们试图手动修正位置时",可以将它排除在外,将特殊字符留在引用的字符串之外 -

您可以通过重新编辑文件来解决问题,这表明确实发生了什么。

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

您可以使用Web上的表或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",   # ا
}

(是的,我在终端上显示字符时遇到了麻烦,就像我说你可能在你的编辑器上看到这些 - 胖子(“\ 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提示符。


0
投票

您可能需要在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("اُلوَ")

0
投票

更新:经过多年的努力,我注意到字母和变音符号在第一次尝试时被放在一起。当我把它们分开时,程序就可以了。

我刚解决了这个问题!我不确定它是否是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
© www.soinside.com 2019 - 2024. All rights reserved.