Почему unicode () использует ул. () на моем объекте только без данного кодирования?

Вы можете использовать easy_date , чтобы сделать его легким:

import date_converter
converted_date = date_converter.string_to_datetime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

6
задан John Millikin 20 September 2008 в 01:14
поделиться

2 ответа

Поведение действительно кажется сбивающим с толку, но интенсиональным. Я воспроизвожу здесь полноту unicode документации из документации Встроенных функций Python (для версии 2.5.2, поскольку я пишу это):

unicode ([объект [кодируя [ошибки]]])

Возвратите строковую версию Unicode объекта с помощью одного из следующих режимов:

Если кодирование и/или ошибки дано, unicode () будет декодировать объект, который может или быть 8-разрядной строкой или символьным буфером с помощью кодека для кодирования. Параметр кодирования является строкой, дающей название кодирования; если кодирование не известно, LookupError повышен. Обработка ошибок сделана согласно ошибкам; это указывает обработку символов, которые недопустимы во входном кодировании. Если ошибки 'строги' (значение по умолчанию), ValueError повышен на ошибках, в то время как значение 'игнорирует' ошибки причин, которые будут тихо проигнорированы, и значение 'замены' заставляет официальный символ замены Unicode, U+FFFD, использоваться для замены вводимых символов, которые не могут декодироваться. См. также модуль кодеков.

Если никакие дополнительные параметры не будут даны, то unicode () будет подражать поведению ул. () за исключением того, что это возвращает строки Unicode вместо 8-разрядных строк. Более точно, если объект будет строкой Unicode или подклассом, то это возвратит ту строку Unicode без любого дополнительного примененного декодирования.

Для объектов, которые обеспечивают __ unicode __ () метод, он назовет этот метод без аргументов для создания строки Unicode. Для всех других объектов, 8-разрядной строковой версии или представления требуется и затем преобразовывается в строку Unicode с помощью кодека для кодировки по умолчанию в 'строгом' режиме.

Новый в версии 2.0. Измененный в версии 2.2: Поддержка __ unicode __ () добавленный.

Так, когда Вы звоните unicode(r, 'utf-8'), это требует 8-разрядной строки или символьного буфера как первый аргумент, таким образом, это принуждает Ваш объект с помощью __str__() метод и попытки декодировать то использование utf-8 кодек. Без utf-8, unicode() функция ищет для a __unicode__() метод на Вашем объекте и не нахождение его, звонят __str__() метод, как Вы предположили, пытаясь использовать кодек по умолчанию для преобразования в unicode.

7
ответ дан 9 December 2019 в 22:42
поделиться

unicode не предполагает кодирование Вашего текста. Если Ваш объект может распечатать себя как unicode, определите __unicode__() метод, который возвращает строку Unicode.


Секрет - это unicode(r) на самом деле не звонит __str__() самостоятельно. Вместо этого это ищет a __unicode__() метод. Реализация по умолчанию __unicode__() будет звонить __str__() и затем попытайтесь декодировать его с помощью ascii набор символов. Когда Вы передаете кодирование, unicode() ожидает первый объект быть чем-то, что может декодироваться - то есть, экземпляр basestring.


Поведение является странным, потому что оно пытается декодировать как ASCII, если я не передаю 'utf-8'. Но если я передаю 'utf-8', он дает другую ошибку...

Поэтому при определении "utf-8" он рассматривает первый параметр как подобный строке объект, который будет декодироваться. Без него он рассматривает параметр как объект, который будет принужден к unicode.

Я не понимаю беспорядок. Если Вы знаете что объект text атрибут всегда будет закодированным UTF-8, просто определять __unicode__() и затем все будет хорошо работать.

4
ответ дан 9 December 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: