Soy nuevo en Python y estoy aprendiendo codificación/codificación, unicode, ascii, etc. Me gustaría imprimir caracteres ASCII según sus códigos y usando la función chr().
def table_ascii(): "procédure imprimant une table des caractères ascii avec leur valeurs" i = 127 while i < 258: print(f"{i} -> {chr(i)}") i += 1 table_ascii()
Desafortunadamente, el resultado es incorrecto. Se detiene en el código 157:
127 -> 128 -> 129 -> 130 -> 131 -> 132 -> 133 -> 134 -> 135 -> 136 -> 137 -> 138 -> 139 -> 140 -> 142 -> 143 -> 144 -> 146 -> 147 -> 148 -> 149 -> 150 -> 151 -> 152 -> 154 -> 155 -> 157 ->
Entiendo que estos códigos se devuelven en blanco, pero ¿por qué detienen el proceso?
Configuración:
Cuando ejecuto este código en Visual Studio Code, el script produce una salida a través de 256. Pero en mi consola (Linux Mate), se bloquea. Eso es difícil de entender para mí...
En primer lugar, ASCII solo sube a 127 (0x7F). chr()
en realidad devuelve el carácter Unicode .
Creo que el problema es que cuando se imprime el comando del sistema operativo (OSC) U+9D (157), su terminal inicia una cadena de control y espera un terminador de cadena como U+9C String Terminator , U+1B Escape seguido de U+5C barra invertida, o U+7 BEL . Dado que ninguna de esas secuencias se imprime más tarde, la terminal deja de mostrar la salida. Para obtener más información, consulte Código de escape ANSI § Secuencias de escape Fe y códigos de control C1 en Wikipedia.
Los caracteres Unicode U+80 (128) a U+9F (159) son caracteres de control, lo que significa que, por lo general, no se pueden imprimir, por lo que, en primer lugar, nunca obtendrá resultados sensatos.
Como se menciona en los comentarios, los caracteres entre 128 y 160 son una especie de tierra de nadie. No están definidos en la especificación Unicode, pero pueden tener un significado especial para varias pantallas. Esa es la razón por la que Unicode no los toca: demasiados usos variables en juego.
Una terminal como Linux xterm acepta códigos de control para hacer cosas como mostrar texto en color. Mirando las secuencias de control Xterm vemos
Privacy Message (PM is 0x9e)
Eso es 158 decimal y es uno de los caracteres de control de 8 bits de xterms. Esto inicia un "mensaje privado" que continúa hasta que se ve un carácter terminador de cadena definido. xterm no implementa el "mensaje privado" y, según su salida, simplemente ignora la salida restante como parte de ese mensaje.
Esto es algo del tipo VT100. Algunos terminales pueden implementar algunas acciones. Otros pueden tener un carácter asignado a ese octeto. No encontrará ninguna implementación consistente.