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.