Проблема с кодировкой символов Python 3

Я выбираю значения из базы данных MySQL // Maria, которая содержит кодировку latin1 с сопоставлением latin1_swedish_ci. Возможны символы из разных европейских языков, таких как испанский ñ, немецкий ä или норвежский ø.

Я получаю данные с

#!/usr/bin/env python3
# coding: utf-8

...
sql.execute("SELECT name FROM myTab")
for row in sql
 print(row[0])

Появляется сообщение об ошибке: UnicodeEncodeError: кодек 'ascii' не может кодировать символ '\ xf1' Хорошо, я изменил свою печать на

print(str(row[0].encode('utf8')))

и результат выглядит так: b '\ xc3 \ xb1' я посмотрел на это Работа с кодировкой utf-8 в исходном коде Python, но я объявил заголовок. Также decode('utf8').encode('cp1250') не помогает


person Joe Platano    schedule 19.06.2017    source источник
comment
спасибо за поддержку. это возвращает UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0   -  person Joe Platano    schedule 20.06.2017
comment
Возможный дубликат Как установить кодировку sys.stdout в Python 3?   -  person Joe Platano    schedule 27.06.2017


Ответы (2)


Хорошо, проблема с кодировкой окончательно решена. Колдспид поставил важную лань с ланью. поэтому вся ему честь! К сожалению, это оказалось не так просто.

Я нашел способ решения проблемы.

import sys
sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf8', buffering=1)

Решение от Джека О'Коннора. опубликовано в этом ответе:

person Joe Platano    schedule 26.06.2017
comment
+1, так как это позволило мне двигаться вперед. Однако разве это не должно быть написано мигающими лампочками вверху где-нибудь вроде docs.python .org / 3 / howto / unicode.html? Моя проблема связана с использованием шаблона jinja2. Если шаблон не содержит Unicode, все в порядке, однако, если где-то в шаблоне присутствует единственный символ Unicode, он ломается. Моя системная локаль - en_US.UTF-8, и никакое количество кодирования / декодирования не решило проблему. Но все вышесказанное кажется настолько фундаментальным, что это не может быть правильным способом? - person Richard Corden; 15.11.2018
comment
Тысячу раз это! Как это не по умолчанию в 2018 году: / - person domenukk; 01.03.2019

Python3 пытается автоматически декодировать эту строку на основе ваших настроек локали. Если ваш языковой стандарт не совпадает с кодировкой в ​​строке, вы получите искаженный текст или он вообще не работает. Вы можете принудительно попробовать кодировать его с помощью вашего языкового стандарта, а затем декодировать до cp1252 (похоже, это кодировка в строке).

print(row[0].encode('latin-1').decode('cp1252'))
person cs95    schedule 19.06.2017
comment
кажется, точка с локалью ведет к цели. к сожалению, ваш подход по-прежнему не дает правильного решения. Но с локалью я приближаюсь. - person Joe Platano; 22.06.2017
comment
@JoePlatano, а что насчет row[0].encode('latin-1').decode('utf-8')? - person cs95; 22.06.2017
comment
Нет, не работает, ну, это работает в оболочке, если я запускаю скрипт как python script.py, он работает. На веб-сервере нет. Я добавил следующие строки print(sys.stdout.encoding) и print(sys.getdefaultencoding()) в оболочке, для обоих есть utf-8. если я выполняю сценарий в браузере, есть ANSI_X3.4-1968 для sys.stdout.encoding и utf-8 для sys.getdefaultencoding (). Я думаю, что в apache есть проблема с локалью - person Joe Platano; 22.06.2017
comment
@JoePlatano О, понятно ... боюсь, я здесь в растерянности. Надеюсь, ты это поймешь! Вы должны попробовать разные кодировки и посмотреть, какая из них работает. - person cs95; 22.06.2017
comment
да, в любом случае, спасибо, что подтолкнули меня в правильном направлении! Поэтому upvote. Спасибо дружище - person Joe Platano; 22.06.2017