etc. dépend du système d'exploitation. --Dans la série Unix (Linux), cela dépend de
locale (LC_CTYPE). --Si vous lisez ou écrivez un fichier sans y penser, vous pouvez rencontrer ʻUnicodeDecodeError
etc. selon l'environnement.with open('utf-8.txt', mode='r') as fp:
text = fp.read()
locale.getpreferredencoding
.
>> import locale
>> locale.getpreferredencoding()
UTF-8
--Parce que getpreferredencoding est ʻUTF-8`, le texte de utf-8 peut être lu sans erreur.
LC_CTYPE
et vérifiez qu'une erreur se produit
--Utilisez setlocale
pour modifier temporairement LC_CTYPE
import locale
locale.setlocale(locale.LC_CTYPE, ('C'))
print(locale.getpreferredencoding(False)) # => US-Devenez ASCII
with open('hoge.txt') as fp:
text = fp.read()
Résultat
US-ASCII
Traceback (most recent call last):
File "test.py", line 7, in <module>
text = fp.read()
File "/path/to/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
Note
-LC sans setloacale_Le même comportement peut être confirmé en modifiant directement la variable d'environnement CTYPE.
- getpreferredencoding(do_setloacal=False)Sinon, le codage temporairement modifié ne pourrait pas être obtenu avec setlocale.
peut maintenant accepter les arguments ʻencoding
, donc vous pouvez l'utiliser (= vous pouvez gérer les fichiers indépendamment de LC_CTYPE
).with open('utf-8.txt', encoding='utf-8') as fp:
text = fp.read()
#! -*- coding:utf-8 -*-
import locale
import codecs
import six
locale.setlocale(locale.LC_CTYPE, ('C'))
with open('utf-8.txt', 'rb') as fp:
text1 = fp.read()
text1 = six.text_type(text1, 'utf-8')
with codecs.open('utf-8.txt', 'r', encoding='utf-8') as fp:
text2 = fp.read()
assert text1 == text2
--Python3 détermine le codage de caractères par défaut lors de la gestion des fichiers en fonction du système d'exploitation et de locale (LC_CTYPE)
Recommended Posts