Comment faire de python 3 print() utf8

Comment puis-je faire de 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 - \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)

De sortie (dans 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 - \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 est juste trop intelligent... 😀 Il n'y a pas de point à l'aide du texte codé avec print (depuis toujours afficher uniquement la représentation d'octets non réel d'octets) et il est impossible d'octets de sortie, parce que l'impression de toute façon et toujours la code de 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:\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>

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


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

J'ai fait un printRAW() fonction qui fonctionne très bien (en fait c'code de sortie de l'UTF-8, donc c'est vraiment pas cru...):

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

 printRAW("Cool", TestText)

De sortie (maintenant c'impression en UTF-8):

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

printRAW(chr(252)) aussi joliment imprime ü (en UTF-8, [xC3][xBC]) et sans erreurs 🙂

Maintenant, je suis à la recherche pour peut-être la meilleure solution si il y a de tout...

  • vérifier ceci trop.
InformationsquelleAutor davispuh | 2010-08-30