1

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

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

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: 'و'
4

3 回答 3

1

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

从 cod-editor 的角度来看,存在一些问题,例如在显示某些特殊 unicode 字符时是否提前一个字符,并且"字符本身可能会显示空间不足 - 当尝试手动更正",可以将其乱序放置,使特殊字符实际上位于引用的字符串之外-

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

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

您可以使用网络上的表格或 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字符有很好的支持——我在一个带有“konsole”终端的Linux系统上。在 Windows 上,idlePython 提示符可能有效,但cmdPython 提示符无效。

于 2016-05-23T12:56:52.203 回答
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
于 2016-05-23T12:00:13.230 回答
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("اُلوَ")
于 2016-05-23T13:02:00.293 回答