utf8 python3 escape python-3.x unicode encoding utf-8 stdout

python-3.x - python3 - unicode escape python



Cómo hacer que python 3 imprima() utf8 (2)

Esto es lo mejor que puedo deducir del manual, y es un poco sucio:

utf8stdout = open(1, ''w'', encoding=''utf-8'', closefd=False) # fd 1 is stdout print(whatever, file=utf8stdout)

Parece que los objetos de archivo deberían tener un método para cambiar su codificación, pero AFAICT no es uno.

Si escribe en utf8stdout y luego escribe en sys.stdout sin llamar a utf8stdout.flush () primero, o viceversa, pueden ocurrir cosas malas.

¿Cómo puedo hacer que python 3 (3.1) print("Some text") en stdout en UTF-8, o cómo dar salida a bytes sin formato?

Test.py

TestText = "Test - āĀēĒčČ..šŠūŪžŽ" # this is UTF-8 TestText2 = b"Test2 - /xc4/x81/xc4/x80/xc4/x93/xc4/x92/xc4/x8d/xc4/x8c../xc5/xa1/xc5/xa0/xc5/xab/xc5/xaa/xc5/xbe/xc5/xbd" # just bytes print(sys.getdefaultencoding()) print(sys.stdout.encoding) print(TestText) print(TestText.encode("utf8")) print(TestText.encode("cp1252","replace")) print(TestText2)

Salida (en CP1257 y yo reemplazamos caracteres a valores de bytes [x00] ):

utf-8 cp1257 Test - [xE2][xC2][xE7][C7][xE8][xC8]..[xF0][xD0][xFB][xDB][xFE][xDE] b''Test - /xc4/x81/xc4/x80/xc4/x93/xc4/x92/xc4/x8d/xc4/x8c../xc5/xa1/xc5/xa0/xc5/xab/xc5/xaa/xc5/xbe/xc5/xbd'' b''Test - ??????../x9a/x8a??/x9e/x8e'' b''Test2 - /xc4/x81/xc4/x80/xc4/x93/xc4/x92/xc4/x8d/xc4/x8c../xc5/xa1/xc5/xa0/xc5/xab/xc5/xaa/xc5/xbe/xc5/xbd''

print es demasiado inteligente ...: D No tiene sentido utilizar texto codificado con print (ya que siempre muestra solo la representación de bytes no reales) y es imposible emitir bytes en absoluto, porque de todos modos se imprime y siempre se codifica en sys.stdout.encoding .

Por ejemplo: print(chr(255)) arroja un error:

Traceback (most recent call last): File "Test.py", line 1, in <module> print(chr(255)); File "H:/Python31/lib/encodings/cp1257.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError: ''charmap'' codec can''t encode character ''/xff'' in position 0: character maps to <undefined>

Por cierto, print( TestText == TestText2.decode("utf8")) devuelve False , aunque el resultado de impresión es el mismo.

¿Cómo determina Python 3 sys.stdout.encoding y cómo puedo cambiarlo?

Hice una función printRAW() que funciona bien (en realidad codifica la salida a UTF-8, así que realmente no está en bruto ...):

def printRAW(*Text): RAWOut = open(1, ''w'', encoding=''utf8'', closefd=False) print(*Text, file=RAWOut) RAWOut.flush() RAWOut.close() printRAW("Cool", TestText)

Salida (ahora se imprime en UTF-8):

Cool Test - āĀēĒčČ..šŠūŪžŽ

printRAW(chr(252)) también imprime muy bien ü (en UTF-8, [xC3][xBC] ) y sin errores :)

Ahora estoy buscando una mejor solución si hay alguna ...


Primero, una corrección:

TestText = "Test - āĀēĒčČ..šŠūŪžŽ" # this NOT utf-8...it is a Unicode string in Python 3.X. TestText2 = TestText.encode(''utf8'') # THIS is "just bytes" in UTF-8.

Ahora, para enviar UTF-8 a stdout, independientemente de la codificación de la consola, use la herramienta adecuada para el trabajo:

import sys sys.stdout.buffer.write(TestText2)

"buffer" es una interfaz en bruto para stdout.