Comment faire Python 3 print () utf8

Comment puis-je faire python 3 (3.1) print("Some text") stdout en UTF-8, ou la façon de sortie octets brutes?

Test.py

TestText = "Test - āĀēĒčČ..šŠūŪžŽ" # this is UTF-8
TestText2 = b"Test2 - xc4x81xc4x80xc4x93xc4x92xc4x8dxc4x8c..xc5xa1xc5xa0xc5xabxc5xaaxc5xbexc5xbd" # just bytes
print(sys.getdefaultencoding())
print(sys.stdout.encoding)
print(TestText)
print(TestText.encode("utf8"))
print(TestText.encode("cp1252","replace"))
print(TestText2)

Sortie (en CP1257 et j'ai remplacé les caractères de valeurs d'octets [x00]):

utf-8
cp1257
Test - [xE2][xC2][xE7][C7][xE8][xC8]..[xF0][xD0][xFB][xDB][xFE][xDE]  
b'Test - xc4x81xc4x80xc4x93xc4x92xc4x8dxc4x8c..xc5xa1xc5xa0xc5xabxc5xaaxc5xbexc5xbd'
b'Test - ??????..x9ax8a??x9ex8e'
b'Test2 - xc4x81xc4x80xc4x93xc4x92xc4x8dxc4x8c..xc5xa1xc5xa0xc5xabxc5xaaxc5xbexc5xbd'

print est juste trop intelligent... :D il ne sert à rien d'utiliser du texte encodé avec print (puisqu'il montre toujours seulement la représentation des octets pas des octets réels) et il est impossible de produire des octets du tout, parce que l'impression de toute façon et l'encode toujours sys.stdout.encoding.

Par exemple: print(chr(255)) renvoie une erreur:

Traceback (most recent call last):
  File "Test.py", line 1, in <module>
    print(chr(255));
  File "H:Python31libencodingscp1257.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>

Par le print( TestText == TestText2.decode("utf8")) retourne False, bien que la sortie d'impression est la même.


comment Python 3 détermine sys.stdout.encoding et comment puis-je le changer?

j'ai fait un printRAW() fonction qui fonctionne bien (en fait il encode la sortie à UTF-8, donc vraiment il n'est pas brut...):

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

 printRAW("Cool", TestText)

Sortie (maintenant c'impression en UTF-8):

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

printRAW(chr(252)) aussi bien imprime ü (en UTF-8 [xC3][xBC]) et sans erreurs :)

maintenant je cherche peut-être une meilleure solution s'il y en a...

33
demandé sur Toby Speight 2010-08-30 06:26:24

2 réponses

tout d'Abord, une correction:

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.

maintenant, pour envoyer UTF-8 à stdout, quel que soit l'encodage de la console, utilisez le bon outil pour le travail:

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

"buffer" est une interface brute vers stdout.

44
répondu Mark Tolonen 2010-09-21 06:38:21

C'est le mieux que je peux dope de la notice, et c'est un peu une sale hack:

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

il semble que les objets file devraient avoir une méthode pour changer leur encodage, mais AFAICT il n'y en a pas.

si vous écrivez à utf8stdout puis à sys.stdout sans appeler utf8stdout.flush() d'abord, ou vice versa, de mauvaises choses peuvent se produire.

13
répondu zwol 2010-08-30 04:20:19