Tratar de cargar los caracteres específicos en Python 3 con Windows PowerShell

Pregunta hecha: hace 8 meses Ultima actividad: hace 8 meses
up 2 down

Estoy de ejecutar este código en Windows PowerShell y que incluye este archivo llamado languages.txt donde yo estoy tratando de convertir entre bytes de cadenas:

Aquí está 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
文言
吴语
ייִדיש
中文

Entonces, aquí está el código que utilicé:

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)

Aquí está la salida (crédito: Learn Python 3 al duro por Zed A. Shaw):

Tratar de cargar los caracteres específicos en Python 3 con Windows PowerShell

Tratar de cargar los caracteres específicos en Python 3 con Windows PowerShell

No sé por qué no carga los personajes y muestra bloques de interrogación en su lugar. ¿Alguien puede ayudarme?

1 respuesta

up 0 down accepted

La primera cadena de caracteres que no es አማርኛ. El primer carácter, está en Unicode 12A0 (ver aquí). En UTF-8, es decir b'\xe1\x8a\xa0'. Por lo tanto, esa parte es, obviamente, encontrar. El archivo es realmente UTF-8.

La impresión no planteó una excepción, por lo que su codificación de salida puede manejar todos los caracteres. Todo esta bien.

La razón única que queda que veo para que falle es que la fuente utilizada en la consola no es compatible con todos los personajes.

Si es sólo para el juego, usted no debe preocuparse por ello. Considere que funcione correctamente.


Por otra parte, sugeriría cambiar algunas cosas en su código:

  1. Estas corriendo main de forma recursiva para cada línea. No hay absolutamente ninguna necesidad de eso y que se encontraría con el límite de recursión en un archivo de más tiempo. usuario una for bucle en su lugar.
for line in lines:
    print_line(line, encoding, errors)
  1. Está abriendo el archivo como UTF-8, por lo que la lectura de él decodifica automáticamente UTF-8 a Unicode, a continuación, se codifica de nuevo en row_bytes y luego codificar de nuevo en cooked_string, Que es la misma que line. Sería un mejor ejercicio para leer el archivo como binario, dividirlo en saltos de línea y luego decodificar. Entonces tendría una idea más clara de lo que está pasando.
with open("languages.txt", 'rb') as f:
    raw_file_contents = f.read()