Юлик написал про свою любимую тему последнего времени — юникод. На этот раз он предлагает посмеяться то ли над Trac, то ли над Django. То ли над "теми, кто считает что в Python хороший unicode support".
Мне думается, что такой пост способен ввести многих в заблуждение и создать неверный миф, поэтому я хочу уточнить: в Питоне на самом деле хорошая поддержка юникода. Там есть:
- прямые юникодные строки (в четырех- или двухбайтовых символах) со всеми строковыми функциями
- поддержка перекодировок между юникодом и однобайтовыми кодировками
- нормализация, декомпозиция, определение принадлежности символа к юникодным группам (модуль unicodedata)
- регулярные выражения, где
\w
действительно умеет соответствовать русским буквам, а не только[a-zA-Z]
Другими словами, такая поддержка юникода многим распространенным языкам и не снилась.
Другое дело, что поддержка юникода в Питоне не идеальна. В первую очередь тем, что она не работает "сама" или "автоматически", а про нее приходится думать. И именно из-за этого люди в ascii-язычном мире часто делают софт на Питоне, который с другими языками не работает, потому что большую часть времени разработки они не в курсе, что он не работает :-). Так, кстати, случилось, и с Django: когда он только выпустился, там были места, где длина строки в utf-8 считалась как len(value)
без предварительной раскодировки в юникод. Но зато из-за того, что это Питон, все эти места оказалось возможным просто починить. А не ждать много лет, когда, наконец, хоть кто-нибудь напишет всю нужную многоязычную инфраструктуру.
Надо сказать, что сам Юлик тоже хотел внести лепту в улучшение отношений Django с юникодом. Но его патч, к сожалению, покинули. Как это часто, к сожалению, в Django бывает.
Но как бы то ни было... Заявлять отстойность языка только на основании того, что на нем написана программа с багом (вот редкость-то!) — это просто несерьезно, IMHBCO.
Комментарии: 16
По поводу PHP вы неправы. Там есть функции работы с Unicode-строками (в виде модуля с префиксом mb_*), причём стандартные вызовы PHP можно заменить на вызовы mb_* автоматически, штатными средствами.
PCRE тоже работает с Unicode-строками - есть специальный ключ. Другое дело, что PHP не делает это нативно и тут есть свои проблемы (например, функция basename, которая отделяет имя файла не будет нормально работать), но в PHP6 ситуация должна измениться.
+\1
а в PHP6, если верить всё тому-же Julik'у будет как раз самая правильная из возможных поддержек Unicode
Это отрадно!
Кстати, к новой большой версии и Питон избавится от байтовых строк, останутся только unicode. Как раз то, к чему все и призывают.
Никогда не испытывал проблем с юникодом. Наверно живу в однобайтовом сером мире ASCII =)
В php5 действительно есть mb, только регулярные выражения в этой библиотеке реализованы в posix формате. Горе тому, кто решится это использовать.
Ждем php6.
ага, подождем-подождем php6 - а потом он окажется таким-же мыльным пузырем как и php5.
Ну ладно уж подстебнуться нельзя ;-)
2Climenty:
PRCE в PHP поддерживают Unicode. Для работы с Unicode можно и нужно использовать их, а не mb_ereg*
2Alex Zhukov:
что значит "таким же мыльным пузырём как и php5"? Что вам не понравилось в PHP5? В нём достаточно много изменений для смены цифры.
Насчет регулярных выражений в PHP. Если надо использовать UTF-8, то достаточно добавить после ограничителей модификатор u и будет вам счастье. Например:
u - должна быть именно маленькая u, а не большая. Вообще я вижу такую проблему - люди осуждают язык (например, PHP), не разобравшись с ним. По-моему, это можно делать только узнав его в совершенстве и поняв все его минусы и плюсы. А рассуждения о том, что он в чем-то плох обычно ведется некомпетентными товарищами, которые нахватались основ.
Это применительно не только к PHP, но и к другим языкам.
забыли добавить, что кроме модификатора "u" надо заменить еще "w" на "p{L}p{Nd}" потому, как автор блога писал вначале, w кириллицу (и любую японницу) за буквы не признает.
А лопатить весь движок для такого функционала приходится, но злость берет :(
Кстати уже два года как ждем все php6 :)
Опа, Иван, добавьте плиз обратные слеши, а то они порезались :(
Вообще-то,
\w
прекрасно работают для русских букв. А вот что такоеp{L}
иp{Nd}
я, признаться, не знаю...(Кусочки кода, чтобы в них ничего не пропадало, можно заключать в
..
)Любопытно, я начал сюда писать, когда мы с Ваней были на «вы».
\p{L}
— это «буквы»,\P{L}
— «не буквы». Это специальные конструкции для Unicode, очень гибкие: http://ru2.php.net/manual/en/regexp.reference.phpНапример,
\p{Lu}
— это большие буквы (upper), а\p{P}
— пункуационный символ. Отличная штука. В PHP они применяются очень широко.Работают mb_ сюникод и с другими синтаксисами (в мануале всё написано). Но есть свои особенности :)
http://ua2.php.net/mb_regex_set_options
i - ONIG_OPTION_IGNORECASE
x - ONIG_OPTION_EXTEND
m - ONIG_OPTION_MULTILINE
s - ONIG_OPTION_SINGLELINE
p - ONIG_OPTION_MULTILINE | ONIG_OPTION_SINGLELINE
l - ONIG_OPTION_FIND_LONGEST
n - ONIG_OPTION_FIND_NOT_EMPTY
j - ONIG_SYNTAX_JAVA
u - ONIG_SYNTAX_GNU_REGEX
g - ONIG_SYNTAX_GREP
c - ONIG_SYNTAX_EMACS
r - ONIG_SYNTAX_RUBY
z - ONIG_SYNTAX_PERL
b - ONIG_SYNTAX_POSIX_BASIC
d - ONIG_SYNTAX_POSIX_EXTENDED
e - eval() resulting code
Выбирай на любой вкус