Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Problème d'encodage à l'affichage de données JSON dans une fenêtre PyQt

+2 votes

Je souhaite créer des widgets (QCheckBox) dynamiquement en fonction de données JSON qui provienne d'un fichier.

Lors de l'affichage les données sont interprétées comme du ISO-8859-1 ("é" devient "é").

# Lecture du fichier JSON
config = None
with open('config.json', 'r') as f:
    config = json.load(f)["config"]

_

# Création de QCheckBox
for nom, adress_list in self.config["destinataires"]["dev"].items():
        box = QCheckBox(dev_box)
        box.setObjectName(nom)
        box.setText(nom)
        dev_box_layout.addWidget(box)

Si je met une string littérale dans le setText() je n'ai pas de problème.
Si je fais un "print()" de "nom" je n'ai pas le soucis.
Dans Sublime le fichier config.json semble bien encodé en UTF-8...

Quelqu'un as une idée ?

demandé 22-Avr-2016 par maxime (160 points)
edité 22-Avr-2016 par max

quelle version de python ?

si version 2.x y a t-il

# -*- coding: utf-8 -*-

sur la ligne une du script qui traite le fichier ?

quand on fait :

file monfichier.json

quelle est le retour affiché ? (utf8 ? iso ? string ? text ? )

Python3.4 PyQt4
La commande file donne bien

config.json: UTF-8 Unicode text, with CRLF line terminators

2 Réponses

+4 votes
 
Meilleure réponse

Ça donne quoi si tu fais :

with open('config.json', 'r', encoding='utf8') as f:
    config = json.load(f)["config"]
répondu 23-Avr-2016 par yoch (2,510 points)
sélectionné 25-Avr-2016 par maxime

Effectivement c'est la bonne solution, je retiens merci

+1 vote

Ok, donc je m'en suis sortie, le problème était que f.read() semble renvoyer des données ISO-8859-1 dans un objet de type str donc pas moyen de faire de decode().
Il faut repasser en bytes et faire un decode().

config = None
with open('config.json', 'r') as f:
    data = f.read()
    data = bytes(data, 'iso-8859-1').decode('utf8')
    config = json.loads(data)["config"]

Par contre si quelqu'un peut expliquer pourquoi f.read() envoi de l'ISO-8859-1 je suis curieux...

répondu 22-Avr-2016 par maxime (160 points)

si telle est la solution ; valider vous meme votre reponse pour que chacun sache que vous avez une solution sans s'attarder davantage sur le pb ;-)

open('config.json', 'r', encoding="utf8") pose le même problème ?

...