Настоятельно рекомендуется не использовать "?" в качестве замены чар. Просто установите выходную кодировку в UTF-8 и покончите с этим.
for s in ("stdin","stdout","stderr"):
setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))
В качестве альтернативы, установите PYTHONIOENCODING
envariable в utf8, чтобы python перестал догадываться о выходной кодировке.
Любой подход бесконечно намного лучше, чем ручное кодирование, что глупо.
Если вы отказываетесь обновиться до Python3, я также рекомендую
from __future__ import unicode_literals
чтобы изгнать всю эту глупость u'...'
.
В последнее время я запускаю все свои программы на Python, например:
#!/usr/bin/env python3.2
# -*- coding: UTF-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
import re
import sys
import os
if not (("PYTHONIOENCODING" in os.environ)
and
re.search("^utf-?8$", os.environ["PYTHONIOENCODING"], re.I)):
sys.stderr.write(sys.argv[0] + ": Please set your PYTHONIOENCODING envariable to utf8\n")
sys.exit(1)
import unicodedata
if unicodedata.unidata_version < "6.0.0":
print("WARNING: Your old UCD is out of date, expected at least 6.0.0 but got",
unicodedata.unidata_version)
wide_enough = (sys.maxunicode >= 0x10FFFF)
if not wide_enough:
print("WARNING: Narrow build detected, your Python lacks full Unicode support!!")