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.

Renvoyer un JSON encodé en utf-8

+1 vote

J'utilise Flask et flask-restful (avec Python 2) pour créer une (mini) API qui prends des informations dans un fichier .txt (enregistré en utf-8) et construit un JSON pour ensuite le renvoyer. Le problème est que par exemple, au lieu d'obtenir un "É" j'obtiens "É"

from flask import Flask, Response
from flask_restful import Resource, Api
import json

app = Flask(__name__)
api = Api(app)

data = list()

with open('./data.txt') as f:
    data.append(f.readlines())

data = [word.strip() for word in data[0]]

class Others(Resource):
    def get(self):
        return Response(response=json.dumps({"Others":data}, ensure_ascii=False, encoding="utf-8"), status=200,  mimetype='application/json')

api.add_resource(Autres, '/data')

if __name__ == '__main__':
     app.run(host="0.0.0.0")
demandé 22-Jul-2016 par kwn (112 points)

1 Réponse

+1 vote

Je suppose que le probleme se situe a la lecture du fichier : il faut le convertir en utf-8 avant de le passer à json.dumps. Pour ça, le plus simple est d'utiliser io.open (en python 2) et de spécifier encoding='utf8'.

répondu 24-Jul-2016 par yoch (2,062 points)

Utiliser io.open ne résout pas le problème. Je pense que ça vient de Flask car le code suivant marche et me renvoie bien mon JSON avec les accents (dans le terminal)

 jt = json.dumps({"Others":data}, ensure_ascii=False, encoding="utf-8")
 print jt

Je ne vois pas trop comment Flask pourrait transformer un encoding correct. Es-tu sur que l'encoding que tu obtiens est faux ?

Aussi, peux-tu stp montrer le code avec io.open stp ?

with io.open('data.txt','r',encoding='utf8') as f:
    data.append(f.readlines())

Je sais pas vraiment comment savoir si l'encoding que j'obtiens est faux ou non mais si j'ai par exemple manger, écouter dans mon fichier txt, si je fais

print json.dumps({"Others":data}, ensure_ascii=False, encoding="utf-8")

en il me retournera bien mon "é" en console, mais quand je le retourne avec Flask, il me changera le "é" en "É". Je me demandais si il ne fallait pas préciser à Flask de bien retourner du utf-8 par défault ou quelque chose comme ça.

Comment vérifie-tu ce que tu renvoie avec flask ? As-tu moyen de l'ecrire dans un fichier pour vérifier ? Ça se trouve c'est juste ton navigateur qui affiche mal le json...

EDIT: au passage, ton code me parait trop lourd, en principe il suffit de faire comme ca non ?

class Others(Resource):
    def get(self):
        return {"Others": data}
...