Lorsque le LANG de l'environnement qui exécute un certain script Python passe de ja_JP.UTF-8 à C, une erreur apparaîtra, alors notez les contre-mesures à ce sujet.
#!/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)
Il est généralement bien de l'exécuter avec LANG = ja_JP.UTF-8. En effet, Python est généralement configuré pour regarder LANG au démarrage et changer le codage par défaut pour l'entrée et la sortie. Donc, si vous amenez ceci à LANG = C, il essaiera d'interpréter UTF-8 comme ASCII et donnera une exception.
Tout d'abord, spécifiez l'encodage pour la lecture du fichier.
tf = open('utf8.txt', encoding='utf8')
Spécifiez que la destination de sortie de sys.stdout utilisée dans l'impression est UTF-8.
sys.stdout = codecs.getwriter("utf8")(sys.stdout.detach())
sys.stderr = codecs.getwriter("utf8")(sys.stderr.detach())
L'enregistreur fonctionne tel quel, mais la sortie est échappée, utilisez donc le sys.stderr modifié.
handler = StreamHandler(sys.stderr)
En résumé, ça ressemble à ça.
#!/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