Хобрук: Ваш путь к мастерству в программировании

Python кодирует юникод utf-8

Я использую селен для вставки ввода текста с немецкими умлаутами в веб-формуле. Заявленная кодировка для скрипта python — utf-8. На странице используется кодировка utf-8. Когда я определяю такую ​​строку, все работает нормально:

q = u"Hällö" #type(q) returns unicode
...
textbox.send_keys(q)

Но когда я пытаюсь прочитать файл конфигурации с помощью ConfigParser (или другого типа файла), я получаю искаженный вывод в веб-формуляре (Hällö). Это код, который я использую для этого:

the_encoding = chardet.detect(q)['encoding'] #prints utf-8
q = parser.get('info', 'query') # type(q) returns str
q = q.decode('unicode-escape') # type(q) returns unicode
textbox.send_keys(q)

В чем разница между обоими q, данными функции send_keys?


  • Вместо этого попробуйте q.decode('latin-1'). 06.08.2017
  • Получение того же искаженного вывода 06.08.2017
  • Это классический пример моджибаке. Если вы сделаете это в терминале UTF-8 (в Python 2 или 3): print(u"Hällö".encode('utf8').decode('latin1')), вы получите Hällö. И наоборот, print(u'Hällö'.encode('latin1').decode('utf8')) печатает Hällö. 06.08.2017

Ответы:


1

Вероятно, это плохая кодировка. Попробуйте напечатать q перед последним оператором и посмотрите, равны ли они. Эта строка q = parser.get('info', 'query') # type(q) returns str должна возвращать строку 'H\xc3\xa4ll\xc3\xb6'. Если они разные, то вы используете неправильную кодировку.

>>> q = u"Hällö"  # unicode obj
>>> q
u'H\xe4ll\xf6'
>>> print q
Hällö
>>> q.encode('utf-8')
'H\xc3\xa4ll\xc3\xb6'
>>> a = q.encode('utf-8')  # str obj
>>> a
'H\xc3\xa4ll\xc3\xb6'  # <-- this should be the value of the str
>>> a.decode('utf-8')  # <-- unicode obj
u'H\xe4ll\xf6'
>>> print a.decode('utf-8')
Hällö
>>> 
06.08.2017

2
from ConfigParser import SafeConfigParser
import codecs

parser = SafeConfigParser()

with codecs.open('cfg.ini', 'r', encoding='utf-8-sig') as f:
    parser.readfp(f)
greet = parser.get('main', 'greet')

print 'greet:', greet.encode('utf-8-sig')

приветствовать: Привет

файл cfg.ini

[main]
greet=Hällö
06.08.2017
Новые материалы

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

Обзор 20 основных и современных методов работы с массивами в JavaScript
Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

Да, но я чувствую необходимость указать, что это или не единственные два.
Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.