u2s=lambda x,y: x.encode(y)
import codecs codecs.encode(unicode, encoding)
str(unicode, encoding)
adrayimport codecs codecs.encode(unicode, encoding)
>>> 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)
odnochlenЧто в этом плохого? Байты тоже символы. Собственно, если ‘str’ - не unicode, то она декодируется дефолтным кодеком (ascii) и затем декодируется в выбранную кодировку.
Проверил - codecs.encode('str', ‘cp1251’) работает. Пичалька. Почему бы хотя бы не кидать исключение “нефиг кодировать из байтов, быдло!”?
adrayА если в ней будет хоть один неаскишный символ, то выкинет UnicodeDecodeError. А настоящая ошибка не в том, что юзер не указал кодировку (ее указать негде), а в том, что он пытается кодировать в кодировку строку.
Собственно, если ‘str’ - не unicode, то она декодируется дефолтным кодеком (ascii) и затем декодируется в выбранную кодировку.
>>> unicode('abcd', 'ascii') u'abcd' >>>
odnochlenнужно переписать всё для третьей версии и забыть уже про второй питон, как про страшный сон
Нужно как в тройке - лишних методов там нет + добавить бы кодеки типа hex, для них действительно имеет смысл перекодирование bytes <-> bytes.
py.user.nextВот такое бы для str.>>> unicode('abcd', 'ascii') u'abcd' >>>
py.user.nextМодули для тройки дай, а то я с радостью.
нужно переписать всё для третьей версии и забыть уже про второй питон, как про страшный сон