Попытка загрузить определенные символы в Python 3 с помощью Windows Powershell - PullRequest
0 голосов
/ 19 января 2019

Я запускаю этот код в Windows Powershell, и он включает в себя этот файл с именем languages.txt, где я пытаюсь преобразовать байты в строки:

Вот languages.txt:

Afrikaans
አማርኛ
Аҧсшәа
العربية
Aragonés
Arpetan
Azərbaycanca
Bamanankan
বাংলা
Bân-lâm-gú
Беларуская
Български
Boarisch
Bosanski
Буряад
Català
Чӑвашла
Čeština
Cymraeg
Dansk
Deutsch
Eesti
Ελληνικά
Español
Esperanto
فارسی
Français
Frysk
Gaelg
Gàidhlig
Galego
한국어
Հայերեն
हिन्दी
Hrvatski
Ido
Interlingua
Italiano
עברית
ಕನ್ನಡ
Kapampangan
ქართული
Қазақша
Kreyòl ayisyen
Latgaļu
Latina
Latviešu
Lëtzebuergesch
Lietuvių
Magyar
Македонски
Malti
मराठी
მარგალური
مازِرونی
Bahasa Melayu
Монгол
Nederlands
नेपाल भाषा
日本語
Norsk bokmål
Nouormand
Occitan
Oʻzbekcha/ўзбекча
ਪੰਜਾਬੀ
پنجابی
پښتو
Plattdüütsch
Polski
Português
Română
Romani
Русский
Seeltersk
Shqip
Simple English
Slovenčina
کوردیی ناوەندی
Српски / srpski
Suomi
Svenska
Tagalog
தமிழ்
ภาษาไทย
Taqbaylit
Татарча/tatarça
తెలుగు
Тоҷикӣ
Türkçe
Українська
اردو
Tiếng Việt
Võro
文言
吴语
ייִדיש
中文

Затем, вот код, который я использовал:

import sys
script, input_encoding, error = sys.argv


def main(language_file, encoding, errors):
    line = language_file.readline()

    if line:
        print_line(line, encoding, errors)
        return main(language_file, encoding, errors)


def print_line(line, encoding, errors):
    next_lang = line.strip()
    raw_bytes = next_lang.encode(encoding, errors=errors)
    cooked_string = raw_bytes.decode(encoding, errors=errors)

    print(raw_bytes, "<===>", cooked_string)


languages = open("languages.txt", encoding="utf-8")

main(languages, input_encoding, error)

Вот результат (кредит: Изучите Python 3 трудным путем Зеда А. Шоу):

Output 1

Output 2

Я не знаю, почему он не загружает символы и вместо этого показывает блоки вопросов.Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 27 января 2019

Первая строка, которая терпит неудачу - አማርኛ. Первый символ находится в юникоде 12A0 (см. здесь ). В UTF-8 это b'\xe1\x8a\xa0'. Итак, эта часть, очевидно, в порядке. Файл действительно UTF-8.

Печать не вызвала исключение, поэтому ваша выходная кодировка может обрабатывать все символы. Все хорошо.

Единственная оставшаяся причина, по которой я вижу его сбой, заключается в том, что шрифт, используемый в консоли, поддерживает не все символы.

Если это только для игры, вам не стоит об этом беспокоиться. Считайте, что это работает правильно.


С другой стороны, я бы предложил изменить некоторые вещи в вашем коде:

  1. Вы запускаете main рекурсивно для каждой строки. В этом нет абсолютно никакой необходимости, и для более длинного файла это приведет к ограничению глубины рекурсии. Вместо этого используйте цикл for.
for line in lines:
    print_line(line, encoding, errors)
  1. Вы открываете файл как UTF-8, поэтому чтение из него автоматически декодирует UTF-8 в Unicode, затем вы кодируете его обратно в row_bytes, а затем снова кодируете в cooked_string, что аналогично line. Было бы лучше прочитать файл как двоичный файл, разделить его на новые строки и затем декодировать. Тогда у вас будет более четкое представление о том, что происходит.
with open("languages.txt", 'rb') as f:
    raw_file_contents = f.read()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...