Supponiamo per un momento che non sia possibile utilizzare print
(e quindi godere del beneficio del rilevamento automatico della codifica). Quindi questo ci lascia con sys.stdout
. Tuttavia, sys.stdout
è così stupido da not do any sensible encoding.Scrittura stringhe unicode tramite sys.stdout in Python
Ora si legge la pagina wiki di Python PrintFails e va a provare il seguente codice:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout);
Tuttavia anche questo non funziona (almeno su Mac). Troppo vedere perché:
>>> import locale
>>> locale.getpreferredencoding()
'mac-roman'
>>> sys.stdout.encoding
'UTF-8'
(UTF-8 è ciò che il proprio terminale capisce).
Così si cambia il codice precedente:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout);
E ora stringhe Unicode vengono inviati correttamente sys.stdout
e quindi stampati correttamente sul terminale (sys.stdout
è attaccato al terminale).
È questo il modo corretto di scrivere stringhe unicode in sys.stdout
o dovrei fare qualcos'altro?
EDIT: a volte - per esempio, quando pipe l'output less
- sys.stdout.encoding
sarà None
. in questo caso, il codice sopra non funzionerà.
s/my/one's/for consistency – icedwater