Как сделать словарь, который содержит арабский диакритический знак в качестве ключа в 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: 'و'
3 ответа
Обновление: я только что заметил, спустя годы, что буквы и диакритические знаки соединяются с первой попытки. Когда я их разделил, программа работала.
Я только что решил проблему! Я не совсем уверен, является ли это ошибкой в 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, диакритические знаки с точки зрения запущенной программы - это просто один символ, как и любой другой, и проблем не должно быть вообще.
С точки зрения редактора трески существуют такие проблемы, как переход на один символ при отображении определенных специальных символов Юникода или нет, и, возможно, "
сам символ может быть показан из пространства - когда кто-то пытается вручную исправить положение "
, можно разместить его не по порядку, оставив специальный символ вне строки в кавычках -
Тот факт, что вы можете решить эту проблему путем повторного редактирования файла, говорит о том, что это действительно так.
Один из способов избежать этого состоит в том, чтобы поместить определенные специальные символы - особенно те, которые имеют различные правила отображения, - это затем экранировать с помощью "\uxxxx"
Юникод кодовая точка Юникод последовательность. Это избавит вас или других людей от проблем при повторном редактировании вашего файла в будущем, так как даже если у вас он работает сейчас, редактор может отображать некорректно, когда они открываются, и, пытаясь исправить это, можно снова нарушить синтаксис,
Вы можете использовать таблицу в Интернете или интерактивную подсказку Python 3, чтобы получить кодовую точку 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, так как поддержка юникода является одной из главных проблем.
2) Для этого также требуется терминал с хорошей поддержкой символов Юникода с использованием кодировки "utf-8" - я работаю в системе 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("اُلوَ")