fogersp
@fogersp

Python: работа с кодировками?

Доброго времени суток!

Питоном пользуюсь редко, но возникла необходимость запустить простенькую REST API, чтобы забирать с сервера данные.
Так вот, практически каждый раз когда я использую Python для чего-либо, у меня возникают проблемы с кодировками. В данном случае - KOI8-R.
Дело в том, что на серваке откуда забираем данные - база в KOI8-R. Как на питоне правильно конвертировать из KOI8-R в UTF-8? Например, я забирают такие данные в json: {'data': [{'fio': 'é×ÁÎÏ× áÌÅËÓÁÎÄÒ ÷ÌÁÄÉÍÉÒÏ×ÉÞ', 'id': 23232, 'login': 'puhlik'}]} или в raw fio = "\u00eb\u00cf\u00da\u00cc\u00d1\u00ce\u00cb\u00cf \u00f2\u00cf\u00cd\u00c1\u00ce \u00e9\u00cf\u00d3\u00c9\u00c6\u00cf\u00d7\u00c9\u00de"
Как мне обработать fio, чтобы получить нормальное "Иванов Александр Владимирович" в utf-8. Пробовал encode и decode - ничего не получается.

#!/usr/bin/env python3

from flask import Flask, request, jsonify
from flask_restful import Resource, Api
from sqlalchemy import create_engine
from json import dumps

db_connect = create_engine('mysql://root:passwd@localhost/my_database', encoding='koi8-r')
app = Flask(__name__)
api = Api(app)

class Users(Resource):
    def get(self, user_id):
        conn = db_connect.connect()
        query = conn.execute("SELECT id, login, fio FROM user WHERE id=%d "  %int(user_id))
        result = {'data': [dict(zip(tuple (query.keys()), i)) for i in query.cursor]}
        return jsonify(result)

api.add_resource(Users, '/users/<int:user_id>')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8088, threaded=True, debug=True)


Клиент:

from urllib import request
import json
from sys import argv

with request.urlopen("http://server.ru:8088/users/{0}".format(argv[1])) as url:
    data = json.loads(url.read().decode())
    print(data['data'][0]['fio'])
  • Вопрос задан
  • 2956 просмотров
Решения вопроса 1
fogersp
@fogersp Автор вопроса
Решено. Оказалось база в latin1, а данные писались в koi8-r
encode('latin1').decode('koi8-r')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы