Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2012 19:21:36

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

Есть ли другое решение вместо unicode.encode(encoding), вроде str(unicode, encoding)?

Офлайн

#2 Окт. 13, 2012 15:22:02

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

u2s=lambda x,y: x.encode(y)
и т.п.? ибо стандартных средств вроде нет



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Окт. 13, 2012 17:39:32

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

python 2.7:

import codecs
codecs.encode(unicode, encoding)

python 3.2:
str(unicode, encoding)

Офлайн

#4 Окт. 13, 2012 18:16:06

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

adray
import codecs
codecs.encode(unicode, encoding)

Это ведь то же самое, что u'unicode'.decode(), включая возможность вызвать decode для юникода?

Офлайн

#5 Окт. 13, 2012 19:04:12

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

>>> pdb.run("'ф'.decode('utf-8')")
> <string>(1)<module>()
(Pdb) s
--Call--
> /usr/lib/python2.7/encodings/utf_8.py(15)decode()
-> def decode(input, errors='strict'):
(Pdb) s
> /usr/lib/python2.7/encodings/utf_8.py(16)decode()
-> return codecs.utf_8_decode(input, errors, True)
(Pdb) s
--Return--
> /usr/lib/python2.7/encodings/utf_8.py(16)decode()->(u'\u0444', 2)
-> return codecs.utf_8_decode(input, errors, True)
как-то так.

Офлайн

#6 Окт. 13, 2012 19:13:41

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

Проверил - codecs.encode('str', ‘cp1251’) работает. Пичалька. Почему бы хотя бы не кидать исключение “нефиг кодировать из байтов, быдло!”?

Отредактировано odnochlen (Окт. 13, 2012 19:14:33)

Офлайн

#7 Окт. 13, 2012 21:04:47

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

odnochlen
Проверил - codecs.encode('str', ‘cp1251’) работает. Пичалька. Почему бы хотя бы не кидать исключение “нефиг кодировать из байтов, быдло!”?
Что в этом плохого? Байты тоже символы. Собственно, если ‘str’ - не unicode, то она декодируется дефолтным кодеком (ascii) и затем декодируется в выбранную кодировку.

Офлайн

#8 Окт. 14, 2012 00:03:34

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

Плохо то, что каша получается.

adray
Собственно, если ‘str’ - не unicode, то она декодируется дефолтным кодеком (ascii) и затем декодируется в выбранную кодировку.
А если в ней будет хоть один неаскишный символ, то выкинет UnicodeDecodeError. А настоящая ошибка не в том, что юзер не указал кодировку (ее указать негде), а в том, что он пытается кодировать в кодировку строку.
Нужно как в тройке - лишних методов там нет + добавить бы кодеки типа hex, для них действительно имеет смысл перекодирование bytes <-> bytes.

Офлайн

#9 Окт. 14, 2012 10:25:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

>>> unicode('abcd', 'ascii')
u'abcd'
>>>

odnochlen
Нужно как в тройке - лишних методов там нет + добавить бы кодеки типа hex, для них действительно имеет смысл перекодирование bytes <-> bytes.
нужно переписать всё для третьей версии и забыть уже про второй питон, как про страшный сон



Отредактировано py.user.next (Окт. 14, 2012 10:27:32)

Офлайн

#10 Окт. 14, 2012 17:51:46

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Юникод в строку без .encode()

py.user.next
>>> unicode('abcd', 'ascii')
u'abcd'
>>>
Вот такое бы для str.

py.user.next
нужно переписать всё для третьей версии и забыть уже про второй питон, как про страшный сон
Модули для тройки дай, а то я с радостью.

Отредактировано odnochlen (Окт. 14, 2012 17:57:29)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version