Cómo hacer que python 3 imprima () utf8

¿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  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  

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 encoding 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.

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 encoding, 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.