Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在python中制作包含阿拉伯字母的字典作为键_Python 3.x_Dictionary_Diacritics_Arabic Support - Fatal编程技术网

Python 3.x 如何在python中制作包含阿拉伯字母的字典作为键

Python 3.x 如何在python中制作包含阿拉伯字母的字典作为键,python-3.x,dictionary,diacritics,arabic-support,Python 3.x,Dictionary,Diacritics,Arabic Support,我正在尝试制作一个程序,将阿拉伯语的发音和字母转换成拉丁语。字母在程序中运行良好,但变音符号无法转换,因为每次运行程序时都会出现错误 一开始,我把变音符号单独作为键,但这不适用于我。请参阅最后一个键,它包含َ,这是一个变音符号,但不能像字母那样正常工作: def convert(lit): ArEn = {'ا':'A', 'ل':'L', "و": "W", "َ":"a"} end_word=[] for i in range(len(lit)): e

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

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

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: 'و'
回溯(最近一次呼叫最后一次):
文件“C:\Users\Abdulaziz\Desktop\converter AR to EN SC.py”,第10行,在
转换
文件“C:\Users\Abdulaziz\Desktop\converter AR to EN SC.py”,第5行,在convert中
end_word.append(ArEn[lit[i]])
关键错误:“و”
更新:几年后,我注意到字母和变音符号在第一次尝试时就组合在一起了。当我把他们分开的时候,程序开始工作了

我刚刚解决了这个问题! 我不确定这是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的编程代码编辑器中很可能存在bug,而不是Pyhton本身。 因为您使用的是Python-3.x,所以从运行程序的角度来看,与其他任何字符一样,变音符号只是一个字符,应该没有任何问题

从cod编辑器的角度来看,存在一些问题,例如在显示某些特殊的unicode字符时是否提前一个字符,并且可能
字符本身会显示空间不足-当试图手动更正
的位置时,可能会将其按顺序放置,将特殊字符实际保留在带引号的字符串之外-

事实上,你可以通过重新编辑文件来解决这个问题,这表明事实确实如此

避免这种情况的一种方法是放置某些特殊字符(特别是具有不同显示规则的字符),即使用
“\uxxx”
unicode码点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",   # ا
}
(是的,我在终端上显示字符时遇到了问题,就像我说的那样,在获取这些字符时,您可能在编辑器上遇到了问题-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”“
——但是使用Python3取消这些字符的匹配要好得多,因为unicode支持是它的一大优势。
2) 这还需要一个终端,该终端支持使用“utf-8”编码的unicode字符——我在一个使用“konsole”终端的Linux系统上。在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("اُلوَ")

这里的问题不是缩进。只要你有
{
来输入dict,Pyhton就不在乎你如何缩进它,直到你将它与
}
匹配。第一行
def convert(lit):
这是在这里发布代码时的格式错误-否则O.P.会报告不同的错误。(我编辑了问题中列出的代码以立即修复)