Как сделать словарь, который содержит арабский диакритический знак в качестве ключа в 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("اُلوَ")
Другие вопросы по тегам