Python koi8 r to utf 8

Кодировки в python

В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).

Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте — для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в «стандарт». Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.

Использование

для того что-бы интерпретатор python понял в какой кодировке файл

Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:

= 6 байт при cp1251
= 12 байт при utf8

Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале:

и если кодировка содержимого в файле отличается от указанной, то в строке могут быть «битые символы»

Загрузка и сохранение файла

# coding: utf8 # Загружаем файл с кодировкай utf8 text = open('file.txt','r').read() # Декодируем из utf8 в unicode - из внешней в рабочую text = text.decode('utf8') # Работаем с текстом text += text # Кодируем тест из unicode в utf8 - из рабочей во внешнюю text = text.encode('utf8') # Сохраняем в файл с кодировкий utf8 open('file.txt','w').write(text) 
# coding: utf8 a = 'Текст в utf8' b = u'Текст в unicode' # Эквивалентно: b = 'Текст в unicode'.decode('utf8') # т.к. сам скрипт хранится в utf8 print 'a =',type(a),a # декодируем из utf-8 в unicode и далее unicode в cp866 (кодировка консоли winXP ru) print 'a2 =',type(a),a.decode('utf8').encode('cp866') print 'b =',type(b),b 

Процедуре print текст желательно передавать в рабочей кодировке либо кодировать в кодировку ОС.
Результат скрипта при запуске из консоли windows XP:

a = type 'str'> ╨в╨╡╨║╤Б╤В ╨▓ utf8 a2 = type 'str'> Текст в utf8 b = type 'unicode'> Текст в unicode 

В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт

Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.
В примере ниже, python сам переводит utf8 в unicode — приводит к одной кодировке для того что-бы сложить строки.

# coding: utf8 # Устанавливаем стандартную внешнюю кодировку = utf8 import sys reload(sys) sys.setdefaultencoding('utf8') a = 'Текст в utf8' b = u'Текст в unicode' c = a + b print 'a =',type(a),a print 'b =',type(b),b print 'c =',type(c),c 
a = type 'str'> Текст в utf8 b = type 'unicode'> Текст в unicode c = type 'unicode'> Текст в utf8Текст в unicode 

Как видим результирующая строка «c» в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.

Пример авто-преобразования кодировок в сравнении

# coding: utf8 # Устанавливаем стандартную внешнюю кодировку = utf8 import sys reload(sys) sys.setdefaultencoding('utf8') print '1. utf8 and unicode', 'true' if u'Слово'.encode('utf8') == u'Слово' else 'false' print '2. utf8 and cp1251', 'true' if u'Слово'.encode('utf8') == u'Слово'.encode('cp1251') else 'false' print '3. cp1251 and unicode', 'true' if u'Слово'.encode('cp1251') == u'Слово' else 'false' 
1. utf8 and unicode true 2. utf8 and cp1251 false script.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal print '3. cp1251 and unicode', 'true' if u'Слово'.encode('cp1251') == u'Слово' else 'false' 3. cp1251 and unicode false 

В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.
В сравнении 2, сравниваются кодировки одного вида — обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.
В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида — рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.

# coding: utf8 d = ['Тест','списка'] print '1',d print '2',d.__repr__() print '3',','.join(d) 
1 ['\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82', '\xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xba\xd0\xb0'] 2 ['\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82', '\xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xba\xd0\xb0'] 3 Тест,списка 

При выводе списка, происходит вызов [<repr>]() который возвращает внутреннее представление этого спиcка — print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку — print 3.

Установка внешней кодировки при запуске

PYTHONIOENCODING=utf8 python 1.py 

статья будет дополняться.

Источник

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

Питоном пользуюсь редко, но возникла необходимость запустить простенькую REST API, чтобы забирать с сервера данные.
Так вот, практически каждый раз когда я использую Python для чего-либо, у меня возникают проблемы с кодировками. В данном случае — KOI8-R.
Дело в том, что на серваке откуда забираем данные — база в KOI8-R. Как на питоне правильно конвертировать из KOI8-R в UTF-8? Например, я забирают такие данные в json: ]> или в 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 " %int(user_id)) result = return jsonify(result) api.add_resource(Users, '/users/') 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/".format(argv[1])) as url: data = json.loads(url.read().decode()) print(data['data'][0]['fio'])

Простой 16 комментариев

Источник

Python koi8 r to utf 8

Administrators

snippsat

(Feb-21-2019, 10:51 AM) AlekseyPython Wrote: When in Python I convert the English- Russian string to koi8-r, I get a strange sequence:

It’s not strange you convert to bytes,in Python 3 are as string(text) Unicode bye default.
Moving to Python 3 Unicode was one the biggest changes.

>>> utf = 'My string, Моя строка' >>> koi = utf.encode(encoding='koi8-r', errors='ignore') >>> koi b'My string, \xed\xcf\xd1 \xd3\xd4\xd2\xcf\xcb\xc1' >>> koi.decode() # Default here is the same as koi.decode('utf-8') Traceback (most recent call last): File "", line 1, in UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 11: invalid continuation byte # Has to use same encoding to get it back to default text(Unicode) Python 3 # Should try to use utf-8 always,makes it better for everyone >>> koi.decode('koi8-r') 'My string, Моя строка'

I don’t see a reason why you should mess with this at all.
Try avoid encoding/decoding at all,let DB handle if needed.
If example test sqlite3 with Python 3.7.
There is no need to do anything,Python 3 text(Unicode default) will go in out DB without any problems.

E:\div_code\xy λ ptpython -i dbb.py >>> bid = Bidbase() >>> bid.create_db() >>> bid.insert('gleen mars', '345678') >>> utf = 'My string, Моя строка' >>> bid.insert('foo', utf) >>> bid.read_all() gleen mars : 345678 foo : My string, Моя строка

Источник

Читайте также:  Python test module load
Оцените статью