Wenn sich die LANG der Umgebung, in der ein bestimmtes Python-Skript ausgeführt wird, von ja_JP.UTF-8 in C ändert, wird ein Fehler angezeigt. Notieren Sie sich daher die Gegenmaßnahmen.
#!/usr/bin/python3
# -*- coding: utf8 -*-
import sys
from logging import getLogger, StreamHandler, DEBUG
handler = StreamHandler()
logger = getLogger(__name__)
logger.setLevel(DEBUG)
logger.addHandler(handler)
str = "Hoge"
tf = open('utf8.txt')
s = tf.read()
print(str)
print(s)
logger.debug(str)
logger.debug(s)
Es ist normalerweise in Ordnung, dies mit LANG = ja_JP.UTF-8 auszuführen. Dies liegt daran, dass Python normalerweise so eingestellt ist, dass es beim Start auf LANG schaut und die Standardcodierung für Eingabe und Ausgabe ändert. Wenn Sie dies also auf LANG = C bringen, wird versucht, UTF-8 als ASCII zu interpretieren, und es wird eine Ausnahme ausgegeben.
Geben Sie zunächst die Codierung zum Lesen der Datei an.
tf = open('utf8.txt', encoding='utf8')
Geben Sie an, dass das im Druck verwendete Ausgabeziel von sys.stdout UTF-8 ist.
sys.stdout = codecs.getwriter("utf8")(sys.stdout.detach())
sys.stderr = codecs.getwriter("utf8")(sys.stderr.detach())
Der Logger funktioniert so wie er ist, aber die Ausgabe wird maskiert. Verwenden Sie daher die geänderte Datei sys.stderr.
handler = StreamHandler(sys.stderr)
Zusammenfassend sieht es so aus.
#!/usr/bin/python3
# -*- coding: utf8 -*-
import codecs
import locale
import sys
from logging import getLogger, StreamHandler, DEBUG, Formatter
sys.stdout = codecs.getwriter("utf8")(sys.stdout.detach())
sys.stderr = codecs.getwriter("utf8")(sys.stderr.detach())
handler = StreamHandler(sys.stdout)
logger = getLogger(__name__)
logger.setLevel(DEBUG)
logger.addHandler(handler)
str = "Hoge"
tf = open('utf8.txt', encoding='utf8')
s = tf.read()
print(str)
print(s)
logger.debug(str)
logger.debug(s)
Recommended Posts