Re: [sisyphus] Re: Сортировка кириллицы вPerl

Dmitriy Ryzhov =?iso-8859-1?q?dryzhov_=CE=C1_bibirevo=2Enet?=
Вт Июн 17 12:16:09 MSD 2003


Hello Alexey,

Sunday, June 15, 2003, 11:06:40 PM, you wrote:

AT> On Sun, Jun 15, 2003 at 05:25:46PM +0300, Michael Shigorin wrote:
>> > 1. Сортировка:
>> > #!/usr/bin/perl -w
>> > 
>> > use strict;
>> > use POSIX;
>> > use locale;
>> > use encoding 'cp1251';
>> > 
>> > my @l1 = ("п", "р", "с", "т");
>> > my @l2 = qw(п р с т);
>> > print "$_(", ord, ") " foreach sort(@l1); print "\n";
>> > print "$_(", ord, ") " foreach sort(@l2); print "\n";
>> > 
>> > Вывод:
>> > п(1087) т(1090) с(1089) р(1088) //?!
>> > п(1087) р(1088) с(1089) т(1090)

AT> Два разных результата?  Этого просто не может быть.

>> > Как всё это объясняется? В доках вроде ничего не нашел.

AT> Дайте подумать. :)

AT> Ну нужно сделать так: во-первых, use encoding 'utf-8'; encoding -- это
AT> кодировка текста в скрипте.

AT> Во-вторых, IMHO для юникодных символов
AT> настройки локали типа collate просто не нужны.  Таблица символов utf-8
AT> уже заранее отсортирована, а правила преобразования символов однозначны
AT> и заранее известны.  В таком случае use locale может что-нибудь ломать.

Да, действительно, убирание use locale помогло!! Посмотрел в доки, там
сказано, что настройки локали и юникод друг на друга не влияют, если
только локаль не utf-8. Однако, про такие глюки там вроде не сказано.

AT> Короче,

AT> #se locale;
AT> use encoding 'utf-8';

Так ведь это означает, что текст написан в utf-8, а не cp1251! Если
текст скрипта не перекодировать, просто перестают восприниматься
русские буквы. Кроме того, по докам для этого вроде нужно использовать прагму use utf8, а не use
encoding (цитата из use encoding "encoding - allows you to write your script in non-ascii or
non-utf8").

-- 
Best regards,
 Dmitriy Ryzhov                            mailto:dryzhov на bibirevo.net



Подробная информация о списке рассылки Sisyphus