Если быть точным, там имеется эпичная еботня с mb_-функциями (в пыхе), от которой меня просто убило нахер. В питоне всё более-менее нормально, если чётко понимать, как происходит ввод-вывод (в encoded-строках, байтах) и внутренняя работа (в decoded, символах).
Я как-то читал просто правило пистона — после ввода данных делай decode, перед выводом делай encode. И неважно, работаешь ли ты с сетью, диском или клавиатурой.
Ты знаешь, в Северной Корее люди тоже не жалуются. Они даже гордятся тем, что им по талонам положено целых 800 г риса на человека. Просто они ничего другого не видели и не в состоянии представить, что бывает юникод без mb_^W^W^Wрис без талонов.
BOM для UTF-8 — это вообще такой адов пиздец, что мне рвёт жопу к хуям. В utf-8 нет понятия endianness, utf-8 кодированный текст — это поток байтов. Ссаное изобретеньице MS для детектирования Little Endian – Big Endian в utf-8 нахуй не нужно в принципе. Аррргх, блядь, пидарасы.
Это довольно очевидно на самом деле. Внутри кода тебе не нужно думать о том, в какой кодировке пришли данные, это важно лишь на стадии сохранения или передачи куда-либо вовне процессора и памяти. Я долго не понимал разницу между байтами и символами, потом разобрался. Одно жаль — не стандартизован формат обмена данными между библиотеками пистона, некоторые либы ожидают символы, некоторые — байты. Вот python-mpd, скажем, требует байты, хотя вполне мог бы сам заэнкодить перед отсылкой в мпд.
Не байт-строку, а простую строку. Ты же декодируешь ИЗ кодировки (она поэтому и называется кодировкой, потому что превращает буквы в байты). Получится unicode-тип.
Кодировка КОДИРУЕТ. К.О. Это из тех вещей, которые достаточно один раз понять, а потом уже сразу интуитивно ясно, где encode, где decode. В питоне 3 просто сделали юникод-строки (хардкоденные) по дефолту. Т.е. в 2 так: "строка".decode('utf-8') (кодировка самого файла сорса, в прыщах, конечно, utf-8) == u"строка". В 3: "строка".encode('utf-8') = ??? Хз, как обозначается заэнкоденная строка.
>>> a = unicode("тест") Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128) >>> a = unicode("тест", "utf-8") >>> a u'\u0442\u0435\u0441\u0442' >>>
Потому что там нет юникода вообще, cp1251 ftw!
Он там плох, просто те, кто пишет на пхп не понимают, что такое "хорошо"...
Потому что это нормальные пацанские языки, которые делали чоткие пацаны с юникодом в крови!
Если быть точным, там имеется эпичная еботня с mb_-функциями (в пыхе), от которой меня просто убило нахер. В питоне всё более-менее нормально, если чётко понимать, как происходит ввод-вывод (в encoded-строках, байтах) и внутренняя работа (в decoded, символах).
скоро подойдет третий питончик, где будут бинарные строки, такие, в которых нихера не сделаешь
Да используйте питон три, ёба!
а ты пробовал?
Да. А теперь, когда под него вышли numpy и scipy я полностью на него перешел
Я слышал, что там по дефолту уже идут юникодные, т.е. decoded в символах. И не нужно писать дурной u перед строкой.
а я жду wsgi
Именно так и есть.
3.2!
Как ты будешь читать файл в UTF-8 с BOM, например?
нет, это значит, что тебе еще чаще придется угадывать куда какой encode/decode влепить
что, уже придумали?
Я думаю, для этого есть ридеры, главное потом сконвертить это в папский utf-8 внутри. А вообще, BOM не нужен, он для bom'ов.
http://www.python.org/dev/peps/pep-3333/ =)
В 3.2 внедрили
сраные гетоебы
>P.J. Eby
EBOO SOBAQUE
1.0 был 0333
Типа того
EBOO PEEDJEY
V POOCKAN DAYOSH?
BEROO
сука, пстопидоры заразные
Это в пхп-то хорошо?
EETS OUKAY TO BE GAY!
Ну они хотя бы естественным путём не размножаются.
ну не жалуются
Размножаются неестественным путём через еблю мозга в псто.
LET'S REJOICE WITH THE BOYZ!
U GOT DA POINT MAN!
У меня из-за этого говна был кот в 4 вложенных трай-эксепт, например.
Я как-то читал просто правило пистона — после ввода данных делай decode, перед выводом делай encode. И неважно, работаешь ли ты с сетью, диском или клавиатурой.
как оказалось, это ок
Как оказалось, это UnicodeError.
Ты знаешь, в Северной Корее люди тоже не жалуются. Они даже гордятся тем, что им по талонам положено целых 800 г риса на человека. Просто они ничего другого не видели и не в состоянии представить, что бывает юникод без mb_^W^W^Wрис без талонов.
BOM для UTF-8 — это вообще такой адов пиздец, что мне рвёт жопу к хуям. В utf-8 нет понятия endianness, utf-8 кодированный текст — это поток байтов. Ссаное изобретеньице MS для детектирования Little Endian – Big Endian в utf-8 нахуй не нужно в принципе. Аррргх, блядь, пидарасы.
Это довольно очевидно на самом деле. Внутри кода тебе не нужно думать о том, в какой кодировке пришли данные, это важно лишь на стадии сохранения или передачи куда-либо вовне процессора и памяти. Я долго не понимал разницу между байтами и символами, потом разобрался. Одно жаль — не стандартизован формат обмена данными между библиотеками пистона, некоторые либы ожидают символы, некоторые — байты. Вот python-mpd, скажем, требует байты, хотя вполне мог бы сам заэнкодить перед отсылкой в мпд.
тактактак. str.decode возвращает байт-строку? А в третьем бидоне к ней нельзя __mod__ применять, например.
Когда все пользователи софта виндовозники, приходится учитывать возможность ВНЕЗАПНОГО ПОЯВЛЕНИЯ ВОМ.
ребята, чисто благодаря вам я только что узнал, что есть такая поебень. Нахуя она нужна?
Не байт-строку, а простую строку. Ты же декодируешь ИЗ кодировки (она поэтому и называется кодировкой, потому что превращает буквы в байты). Получится unicode-тип.
аа, ок
Windows users are boms.
А я ебу?! Но если такая хуйня встретится в файле, то твое приложение должно нормально его проглотить, как если бы этого говна не было.
здесь хорошо объясняют http://en.wikipedia.org/wiki/Byte_order_...
Суть в том, чтобы детектить порядок байтов: "\x12\x34" — это 0x1234 или 0x3412?
чтоб они на псто на тег *гей подписаны все были
вообще я бы клал хуй и считывал U+FEFF ZERO WIDTH NO-BREAK SPACE как есть. Кому он мешает, блядь?
Кодировка КОДИРУЕТ. К.О. Это из тех вещей, которые достаточно один раз понять, а потом уже сразу интуитивно ясно, где encode, где decode. В питоне 3 просто сделали юникод-строки (хардкоденные) по дефолту. Т.е. в 2 так: "строка".decode('utf-8') (кодировка самого файла сорса, в прыщах, конечно, utf-8) == u"строка". В 3: "строка".encode('utf-8') = ??? Хз, как обозначается заэнкоденная строка.
b"..." же
Точно, уже проверил. У меня что-то вытянуло питон3, так что можно поиграть.
И кстати, >>> a = unicode('тест')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'unicode' is not defined
Т.е. теперь str всегда юникодный. А энкоднутое:
>>> type(a.encode('utf-8'))
<class 'bytes'>
Это всё хорошо, но приходится наворачивать лишний кот. А у меня его там и так 600 кило.
Пойду пилить свой язык с блекджеком, UTF-8 по дефолту и встроенной enca.
>>> a = unicode("тест")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128)
>>> a = unicode("тест", "utf-8")
>>> a
u'\u0442\u0435\u0441\u0442'
>>>