URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7060
[ Назад ]

Исходное сообщение
"perl utf8 как понизить регистр строк?"

Отправлено Васька , 21-Дек-07 14:06 
Добрый день,

беру строку из базы в utf8, локаль utf8 скрипты в utf8.
lc($str) уменьшает регист только латинский букв.
Если добавлять прагмы
use utf8
use encoding UTF-8
use locale
перестают работать регулярные выражения.
Как заставить перл понимать кириллицу в utf8?


Содержание

Сообщения в этом обсуждении
"perl utf8 как понизить регистр строк?"
Отправлено Аноним , 21-Дек-07 14:21 
>Добрый день,
>
>беру строку из базы в utf8, локаль utf8 скрипты в utf8.
>lc($str) уменьшает регист только латинский букв.
>Если добавлять прагмы
>use utf8
>use encoding UTF-8
>use locale
>перестают работать регулярные выражения.
>Как заставить перл понимать кириллицу в utf8?

Perl -- мегатупой язык! никакие use'ы не способны вправить ему мозг.
Самый надёжный способ -- перепаковать переменную с явным указанием, что
она UTF-ная. Вот так:
my $t = 'что-то в UTF'
# перепакуем
$t = pack 'U*', unpack 'U0U*', $t;
# преобразуем
print uc($t);


"perl utf8 как понизить регистр строк?"
Отправлено Васька , 21-Дек-07 15:08 
>
>Perl -- мегатупой язык! никакие use'ы не способны вправить ему мозг.
>Самый надёжный способ -- перепаковать переменную с явным указанием, что
>она UTF-ная. Вот так:
>my $t = 'что-то в UTF'
># перепакуем
>$t = pack 'U*', unpack 'U0U*', $t;
># преобразуем
>print uc($t);

uc/lc действительно заработали, но появились другие проблемы:
Wide character in send at /usr/lib/perl/5.8/IO/Socket.pm line 218.
и при работе с dbm



"perl utf8 как понизить регистр строк?"
Отправлено Аноним , 21-Дек-07 17:26 
>[оверквотинг удален]
>>она UTF-ная. Вот так:
>>my $t = 'что-то в UTF'
>># перепакуем
>>$t = pack 'U*', unpack 'U0U*', $t;
>># преобразуем
>>print uc($t);
>
>uc/lc действительно заработали, но появились другие проблемы:
>Wide character in send at /usr/lib/perl/5.8/IO/Socket.pm line 218.
>и при работе с dbm

аа :)))
привет лари волу :-)
на самом деле у вас уже сейчас всё должно работать правильно,
но строго говоря, стратегия такая:

my $t = 'читаем в UTF';
$t = pack 'U0C*', unpack 'C*', $t; # вот теперь перл понял, что оно в UTF
$t = uc($t) # работаем
$t = pack 'C*', unpack 'C0C*', $t; # теперь перл забыл, что оно в UTF и ему снова хорошо
print $t; # сохраняем $t куда нам надо

бросьте вы этот перл :-) помойка это :-)


"perl utf8 как понизить регистр строк?"
Отправлено Васька , 24-Дек-07 07:56 

>[оверквотинг удален]
>но строго говоря, стратегия такая:
>
>my $t = 'читаем в UTF';
>$t = pack 'U0C*', unpack 'C*', $t; # вот теперь перл понял,
>что оно в UTF
>$t = uc($t) # работаем
>$t = pack 'C*', unpack 'C0C*', $t; # теперь перл забыл, что
>оно в UTF и ему снова хорошо
>print $t; # сохраняем $t куда нам надо
>

так и сделал, тупо переписал все строковые функции


>бросьте вы этот перл :-) помойка это :-)

не могу бросить, в древние времена написал на нем большой проект
и теперь настало временя перевести его на utf тут гемор и вылез



"perl utf8 как понизить регистр строк?"
Отправлено Аноним , 24-Дек-07 08:56 
>>бросьте вы этот перл :-) помойка это :-)
>
>не могу бросить, в древние времена написал на нем большой проект
>и теперь настало временя перевести его на utf тут гемор и вылез
>

как я вас понимаю. тоже маюсь с ним и конца-края этому не видно.
жалко, что в девяностых не было питона и руби :-)


"perl utf8 как понизить регистр строк?"
Отправлено angra , 24-Дек-07 15:59 
Что приятно в перле, что он отсеивает большую часть идиотов, вроде вас. К сожалению некоторые кроме врожденного слабоумия похоже еще имеют и ослиную упрямость. К сведению доморощенных дебилов, не способных прочитать и осмыслить perluniintro и perlunicode, первый релиз python был в 91-м, а Ruby в 93-м. А теперь домашнее задание, посмотреть когда в каждом из языков появилась поддержка юникода и как она выглядела, можете попробовать со словариком перевести фразу "Ruby currently lacks full support for Unicode, though it has partial support for UTF-8.", а также посмотреть запланированные фичи python3000 на эту тему.

"perl utf8 как понизить регистр строк?"
Отправлено Аноним , 24-Дек-07 16:46 
>Что приятно в перле, что он отсеивает большую часть идиотов, вроде вас.
>К сожалению некоторые кроме врожденного слабоумия похоже еще имеют и ослиную
>упрямость. К сведению доморощенных дебилов, не способных прочитать и осмыслить perluniintro
>и perlunicode, первый релиз python был в 91-м, а Ruby в
>93-м. А теперь домашнее задание, посмотреть когда в каждом из языков
>появилась поддержка юникода и как она выглядела, можете попробовать со словариком
>перевести фразу "Ruby currently lacks full support for Unicode, though it
>has partial support for UTF-8.", а также посмотреть запланированные фичи python3000
>на эту тему.

Вот это вы чего сейчас сказали? Это от большого ума чтоли? :-) Это он в такой форме из вас прёт? :-))) Попритдержите ум-то :-) Уверяю вас, ваш ум никому не интересен :-)


"perl utf8 как понизить регистр строк?"
Отправлено angra , 24-Дек-07 17:09 
Действительно, что это я. Правы были древние - споря с дураком сам становишься дураком.


"perl utf8 как понизить регистр строк?"
Отправлено Аноним , 25-Дек-07 09:59 
>Действительно, что это я. Правы были древние - споря с дураком сам
>становишься дураком.

Ну спор-то как раз начали вы :-) рискованно :-)

А можно всё же вас побеспокоить вопросом?
Мне очень интересен портрет современного перловика, я надесь, что общение с вами позволит мне его дополнить. Вы не похвастаетесь, как давно вы программируете, что программируете?.. На мой взгляд, современные скрипт-программисты довольно чётко делятся на три группы:
1) Молодые люди (20-25), они не изучают Perl в принципе. Для быстрой разработки они используют PHP, для качественной -- Python (реже что-то другое).
2) Старые перловики, которые допускают, что в мире может ещё что-то произойти. Эти люди по-порежнему программируют на перл (уже больше десяка лет), но поглядывают в сторону более современных решений. Для таких людей не представляет труда написать C-расширение для руби.
3) Старые перловики, которые считают, что предел совершенства достигнут. Перл -- форева :-) Эти люди не изучают ничего нового.

Если моя систематизация работает (а я работаю в организации, где работает примерно 5000 программистов; статистика имеется :-)), то вот ваш портрет (несколько штрихов с разных сторон :-)):
- вам 30-40 лет
- вы давно программируете на перл и давно не программируете ни на чём другом (ну может чуть-чуть PHP без объектов)
- вы не любите и не используете рекурсию
- вы не пользуетесь системами контроля версий (SVN/CVS) или пользуетесь очень ограниченно
- вы работете под виндовс и используете продвинутый редактор типа лультиедитора (угадал?)
- вы не умеете писать расширения перл (XS)
- вы не знаете чем отличает контестно-свободная грамматика от регулярной грамматики
- вы не знаете ничего о функциональном программировании (ну, может быть, только общие слова)
- вы поддерживаете очень старый и очень отвественный проект и не занимаетесь ни чем другим
- вы не доверяете людям
- возможно у вас есть подчинённый, но отношения с ним у вас не клеются

хотя, возможен и другой вариант :-) вы просто работаете в очень маленькой конторке за $500-$800... тогда вы можете быть кем угодно... у вас нет ни подчинённых, ни крупных проектов, ни денег... вы просто не занимаетесь серьёзным программированием. хотя... нет-нет :-) как я мог допустить такую мысль? :-)

я буду очень признателен, если вы подтвердите или опровергните мою теорию.


"perl utf8 как понизить регистр строк?"
Отправлено angra , 25-Дек-07 22:16 
>- вам 30-40 лет

чуть меньше
>- вы давно программируете на перл и давно не программируете ни на
>чём другом (ну может чуть-чуть PHP без объектов)

нет, нет
>- вы не любите и не используете рекурсию

я не пихаю ее во все щели и хорошо представляю где она выгодна, а где противопоказана.
>- вы не пользуетесь системами контроля версий (SVN/CVS) или пользуетесь очень ограниченно

чаще всего SVN
>- вы работете под виндовс и используете продвинутый редактор типа лультиедитора (угадал?)

нет, нет
>- вы не умеете писать расширения перл (XS)

не было нужды, C/C++ владею, примеров XS кода достаточно, если будет нужда напишу.
>- вы не знаете чем отличает контестно-свободная грамматика от регулярной грамматики

не отношу себя к "титиретикам"
>- вы не знаете ничего о функциональном программировании (ну, может быть, только
>общие слова)

С общими концепциями знаком, часть из них может быть реализована в том же перле. Не было ни одного заказа связанного с функциональным языком. Нет смысла изучать языки без реальных заданий. Лемминги бегущие за модными веяниями смешат.
>- вы поддерживаете очень старый и очень отвественный проект и не занимаетесь
>ни чем другим

да, нет
>- вы не доверяете людям

В чем  именно? На всякий случай есть как минимум два значения у понятия "доверять"
>- возможно у вас есть подчинённый, но отношения с ним у вас
>не клеются

Когда были особых проблем не возникало.
>хотя, возможен и другой вариант :-) вы просто работаете в очень маленькой
>конторке за $500-$800... тогда вы можете быть кем угодно... у вас
>нет ни подчинённых, ни крупных проектов, ни денег... вы просто не
>занимаетесь серьёзным программированием. хотя... нет-нет :-) как я мог допустить такую
>мысль? :-)

нет
>я буду очень признателен, если вы подтвердите или опровергните мою теорию.

Итого в большая часть утверждений неверна. Удачи в построении новых теорий :), а маны все таки почитайте.

Кстати очень интересно что за организация с 5000 программистов.


"perl utf8 как понизить регистр строк?"
Отправлено Аноним , 21-Дек-07 14:41 
То же самое pack/unpack можно сделать менее производительно, но какбы прилично :-)
use Encode;
$t=decode_utf8($t);

после этого с $t начнут работать и регэкспы и length и uc/lc... но это тоже самое, что pack/unpack


"perl utf8 как понизить регистр строк?"
Отправлено ivangogh , 31-Авг-10 02:44 
>То же самое pack/unpack можно сделать менее производительно, но какбы прилично :-)
>
>use Encode;
>$t=decode_utf8($t);
>
>после этого с $t начнут работать и регэкспы и length и uc/lc...
>но это тоже самое, что pack/unpack

Можно так:

use Encode;
$t = decode("cp1251", "$t");
$t = uc($t);
$t = encode("cp1251", "$t");


"perl utf8 как понизить регистр строк?"
Отправлено xWAR , 09-Мрт-09 14:37 
МОжет так поможет))
$ttt=~ tr/А-Я/а-я/;


"perl utf8 как понизить регистр строк?"
Отправлено XoRe , 22-Сен-09 16:46 
>МОжет так поможет))
>$ttt=~ tr/А-Я/а-я/;

tr работает побайтово, а "А" в utf8 - это уже два байта.
Другими словами - сработает не так, как нам надо)


"perl utf8 как понизить регистр строк?"
Отправлено Kuzmich , 29-Сен-12 16:23 
Можно так:
use Encode;
$t = encode_utf8(lc(decode_utf8($t)));