Depuis que str est devenu Unicode Qu'en est-il du CP932 représenté par le Shift-JIS conventionnel?
Lorsqu'une erreur de conversion ascii se produit lors de la sortie en standard sous Windows. Je l'ai organisé pour voir ce que c'était.
Windows Python3 (Anaconda3)
Dans Python3, il existe deux types de chaînes. --str type (Unicode uniquement)
str est pour UTF-8 uniquement. Les autres chaînes de codage ne peuvent pas être stockées. D'autre part, byte peut stocker n'importe quelle chaîne de caractères de revêtement circulaire. Bien sûr, UTF-8 est également possible. Vous pouvez convertir de str en octet avec encode () et vice versa avec decode (). Si vous ne savez pas lequel est lequel, vous pouvez faire dir (str). Il n'y a pas deux types de fonctions comme dans Python2.
En Python2, il existe un type str et un type unicode.
Sortie standard Windows interne Python3(contribution)
========== ===================
UTF-8 ----------------------> CP932
(type de str) str.encode('CP932') (type d'octet)
<----------------------
byte.decode('CP932')
La sortie standard de Windows utilise un encodage appelé CP932. Par conséquent, lorsque la chaîne de caractères str est sortie en standard ou écrite dans un fichier, la conversion en CP932 fonctionne automatiquement par défaut.
En fait, même si Python ne convertit pas explicitement, lors de l'exécution de la sortie standard, etc., il se convertit automatiquement en encodage système, puis essaie de sortir.
Dans le cas de Windows, il tente de se convertir en CP932, donc s'il ne peut pas être converti en CP932, une exception UnicodeEncodeError se produit.
>>> s = '\xa0'
>>> print(s)
>>> s.encode('utf-8')
b'\xc2\xa0'
>>> s.encode('cp932')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 0: illegal multibyte sequence
La cause de UnicodeEncodeError est qu'il contient du code qui ne peut pas être converti en CP932, donc si vous supprimez le code qui fait la mauvaise chose, il peut être résolu.
Dans ce cas, \ xa0 est incorrect, donc si vous le remplacez par la fonction de remplacement, l'erreur d'exception n'apparaîtra pas.
>>> s
'\xa0'
>>> s.encode('cp932')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 0: illegal multibyte sequence
>>> s2 =s.replace('\xa0', '')
>>> s2.encode('cp932')
b''
Il est gênant et facile de divulguer le code qui ne peut pas être converti en CP932. En premier lieu, j'ai pensé qu'il pourrait y avoir une option à ignorer si elle ne pouvait pas être convertie en fonction d'encodage, et lorsque je l'ai recherchée sur Google, il y avait une option ignorer.
[Référence] Conversion en chaîne d'octets https://docs.python.jp/3/howto/unicode.html (En plus d'ignorer, il y a remplacer, remplacer le nom, etc.)
Un exemple de suppression d'une erreur d'exception à l'aide de l'option ignore.
>>> s.encode('cp932')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 0: illegal multibyte sequence
>>> s.encode('cp932', "ignore")
b''
Les chaînes de caractères contenant \ xa0 etc. sont gérées en interne comme UTF-8 dans Python3, elles peuvent donc être traitées sans problème en Python, mais dans les cas où elles doivent être converties en CP932 dans un environnement Windows, par exemple. , Lors de la sortie standard ou lors de la sortie sous forme de fichier Unicode --> CP932 Le processus de conversion en est exécuté. À ce moment-là, UnicodeEncodeError se produira, donc si vous l'encodez une fois avec l'option ignore, le convertissez en type d'octet et le renvoyez en str avec décodage, vous pouvez désormais éviter UnicodeEncodeError. De plus, lors de l'écriture dans un fichier, le type d'octet ne peut être sorti qu'en mode binaire, spécifiez donc le mode binaire ('wb' ou 'ab' au lieu de 'w' ou 'a') lors de l'ouverture du fichier. Dans le cas de open using codecs, l'option encoding and ignore peut être spécifiée au moment de open, et le type str peut être sorti tel quel.
Exemple de sortie standard:
import codecs
s = '\xa0'
b = s.encode('cp932', "ignore")
s_after = b.decode('cp932')
print(s_after)
Exemple de sortie de fichier:
f = open('test', 'ab')
s = '\xa0'
b = s.encode('cp932', 'ignore')
f.write(b)
f.close()
Exemple de sortie d'un fichier à l'aide de codecs:
import codecs
f = codecs.open('test', 'ab', 'cp932', 'ignore')
s = '\xa0'
f.write(s) #Si vous utilisez des codecs, vous pouvez écrire comme str
f.close()
Python3 Unicode HOWTO https://docs.python.jp/3/howto/unicode.html
CP932 et UTF-8 https://android.googlesource.com/toolchain/benchmark/+/master/python/src/Modules/cjkcodecs/README
Recommended Posts