Parfois, il est nécessaire d'améliorer la qualification, et en général, il est utile pour le cerveau d'étudier. C'est pourquoi j'ai récemment suivi un cours pour apprendre Python et tous ses frameworks. L'autre jour, je suis arrivé à Django. Et ici, au cours de la formation, nous avons collectivement attrapé non seulement un bug, mais un effet merveilleux à la jonction de Python 3, Sqlite 3, JSON et Win 10. De plus, l'effet était si merveilleux que Google ne nous a pas aidés - tout le groupe intéressé devait se réunir avec l'enseignant et le résoudre avec l'esprit collectif.
Mais le point est le suivant: nous avons étudié la base de données (et Django a Sqlite 3 préinstallé) et, pour ne pas avoir besoin de reprendre les données avec nos mains, nous avons resserré le chargement avec un script à partir de fichiers json. Et les données de la base de données ont été vidées dans les fichiers à l'aide des méthodes Python:
python manage.py dumpdata -e contenttypes -o db.json
Soudainement, ceux qui travaillaient sous Windows (je ne peux pas me porter garant de toutes les versions, seuls les résidents de Win 10 nous ont proposé), ont découvert qu'ils utilisaient le codage Windows-1251. De plus, les jaysons dans cet encodage sont parfaitement alimentés dans la base de données. Mais dès qu'ils ont été reformatés dans les documents standard pour Sqlite 3, Python 3, et surtout pour JSON, l'encodage UTF-8, au mieux, l'alphabet cyrillique de la base de données s'est transformé en citrouille, et au pire, l'ensemble des données le processus de chargement est tombé en panne.
Rien de tel n'a pu être trouvé ni dans la documentation ni dans le reste de Google, y compris la langue anglaise. Ce qui est le plus mystérieux, le chargement manuel des mêmes données via la console ou le panneau d'administration du projet fonctionnait comme une horloge, bien que l'encodage y était définitivement UTF-8. De plus, la prescription obligatoire du codage à la base de données n'a donné aucun effet.
Nous avons supposé que la raison de l'effet était l'interaction de Jason avec le système d'exploitation - d'une manière ou d'une autre, lors de l'écriture et de la lecture de Jason, le système imposait son propre codage au lieu du codage normal. Et en effet, lorsque l'encodage UTF-8 a été défini de force lors de l'ouverture du fichier:
open(os.path.join(JSON_PATH, file_name + '.json'), 'r', encoding="utf-8")
ce n'est pas du krakozyabry qui est entré dans la base, mais des lettres russes normales. Mais le problème de la création d'un vidage de cette manière ne peut pas être résolu, puis retravailler l'encodage à la main n'est pas non plus notre solution.
.
. :
, , :
( ) :
"" " ":
"-: (UTF-8) .
, .
, ( , ), - . .