Python 2.7: output utf-8 i Windows-konsollen

Indlæg af Hanne Mølgaard Plasc

Problem



Lad os sige


s = u"testu0627u0644u0644u0647 u0623u0643u0628u0631u7206u767Au043Eu043Bu043Eu043Bu043E"


Hvis jeg forsøger at udskrive det direkte,


>>> print s
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character u'u0627' in position 4: illegal multibyte sequence


Så jeg skifter konsollen til UTF-8 fra Python (ellers forstår jeg ikke min indgang).


import win32console
win32console.SetConsoleOutputCP(65001)
win32console.SetConsoleCP(65001)


Udfør derefter strengen kodet som utf-8, fordi Python ikke ved, at chcp 65001 er UTF-8 (en kendt fejl). [8]


>>> print s.encode('utf-8')
testالله أكبر爆発ололоTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 0] Error


Som du kan se, udskriver den med succes, indtil den rammer en ny linje, så kaster den en IOError.


Følgende løsning virker:


def safe\_print(str):
    try:
        print str.encode('utf-8')
    except:
        pass
    print

>>> safe\_print(s)
testالله أكبر爆発ололо


Men der skal være en bedre måde. Nogen forslag?

Bedste reference


Søger SO for python utf8 windows bringer som første resultat spørgsmålet Få python til at udskrive i UTF8 på Windows XP med konsollen, der beskriver, hvad der er problemet med udskrivning utf8 i Windows fra Python.

Andre referencer 1


Jeg teste det ikke på windows, men her kan du få et lille initialiserings script til både win/linux til at konfigurere outputkodning korrekt, herunder logging interface osv. Modulet gør også output farvet (herunder opdatering af 'logging' interface)? men du kan nemt afskære den unødvendige funktionalitet: -). [11]


Sådan påberåber du ikke-farvet variant:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from setupcon import setup\_console
setup\_console('utf-8', False)


og farvet variant:


import setupcon
setupcon.setup\_console()
import logging
#...
if setupcon.ansi:
    logging.getLogger().addHandler(setupcon.ColoredHandler())


Hvis løsningen virker for dig, kan du enten læse dokumentationen her: http://habrahabr.ru/blogs/python/117236/, på russisk, eller jeg/nogen kan oversætte den til dig på forespørgsel: -). [12]