Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Проблема с кодировками.


Автор: antananarivu 25.6.2010, 16:29
Недавно работаю в Perl.
Возникла проблема, не знаю, как подступиться.

С помощью Perl обрабатываю строку вида "=?koi8-r?B?7sHLzMHEzsHRIzU2mjc3NV/u5evz9Ozh6u4ueGxz?=" она находится в $arrayt[$xx].

Код

($b,$s) = split(/\?B\?/,$arrayt[$xx]); #отрубаем служебную информацию вида =?koi8-r?B?
my $indt = index $b,"=?";
substr($b,0,$indt) = ""; #убираем =?
($st,$rest) = split(/\?=/,$s); #отрубаем окончание строки ?=
$encoded_attname = decode_base64($st); # получаем результат
 $conv = Text::Iconv->new($b, "UTF8");
 $encoded_attname=$conv->convert($encoded_attname); # преобразование в UTF8


В результате в  $encoded_attname получаем строку следующего вида: "Накладная#56 775_НЕКСТЛАЙН.xls"

А теперь мне необходимо избавится в строке от всех символов кроме букв, цифр, знаков препинания и пробела и я пишу регулярное выражение:
Код

$encoded_attname =~ s/[^\ A-Za-z0-9\а\б\в\г\д\е\ё\ж\з\и\й\к\л\м\н\о\п\р\с\т\у\ф\х\ц\ч\ш\щ\ъ\ы\ь\э\ю\я\А\Б\В\Г\Д\Е\Ё\Ж\З\И\Й\К\Л\М\Н\О\П\Р\С\Т\У\Ф\Х\Ч\Ц\Ш\Щ\Ъ\Ы\Ь\Э\Ю\Я\.\,\;\:\(\)\*\&\^\%\$\#\@\!\+\=\_\-\?\№]//g;


В результате, почемуто получаем строку такого вида: "Накладная#56�775_НЕКСТЛАЙН.xls".

То есть по какой-то неведомой мне причине появляется некорректно отображаемый символ. Природу которого я не могу понять. Из-за него не получается ни корректно передать строку, не склеить ее с другой подстрокой. 
И собственно 2 вопроса: почему так происходит? Кто нибудь сталкивался с таким?
И второй подвопрос: почему в регулярном выражении не работают корректно [А-Яа-я] Когда я попытался употребить их в таком виде получалась вообще какая-то каша. Половину букв удалялась, половина оставалась.

Если это важно в программе использую 
use bytes;

Заранее спасибо.



Автор: arto 25.6.2010, 20:33
# perl -MData::Dumper -MMIME::Words=:all -le 'print Dumper decode_mimewords ($ARGV[0])' "=?koi8-r?B?7sHLzMHEzsHRIzU2mjc3NV/u5evz9Ozh6u4ueGxz?="
$VAR1 = [
          'Накладная#56 775_НЕКСТЛАЙН.xls',
          'koi8-r'
        ];
#

Автор: antananarivu 26.6.2010, 08:59
А можно поподробнее?
Я не вижу, где здесь происходит удаление всех символов, кроме букв, цифр, знаков препинания и пробела. 

Автор: arto 26.6.2010, 12:14
perldoc MIME::Words

Автор: antananarivu 28.6.2010, 12:15
Спасибо. Использовал. Все получилось. Но проблема не исчезла. 
Пример.
Строка  ($sp) - "По документу Снятие заказа № 10 146 от 07.06.2010 19:35:19 сняты следующие  позиции....  ". Явным видом в utf-8.

Код

my $sp = decode_mimewords($subject);
my $charset = Lingua::DetectCharset::Detect($sp);
$sp = Convert::Cyrillic::cstocs($charset, 'UTF8', $sp);


Если вставить строку в WORD видно, что между 10 и 146 есть неразравный пробел. При попытке вот такого кода:
Код

$encoded_attname =~ s/[^\ A-Za-z0-9\а\б\в\г\д\е\ё\ж\з\и\й\к\л\м\н\о\п\р\с\т\у\ф\х\ц\ч\ш\щ\ъ\ы\ь\э\ю\я\А\Б\В\Г\Д\Е\Ё\Ж\З\И\Й\К\Л\М\Н\О\П\Р\С\Т\У\Ф\Х\Ч\Ц\Ш\Щ\Ъ\Ы\Ь\Э\Ю\Я\.\,\;\:\(\)\*\&\^\%\$\#\@\!\+\=\_\-\?\№]//g;

Строка перестает восприниматься корректно. Не конкатенируется, не выводится на экран.
Очень нужна помощь.


Более общий вопрос. Мне нужно строку (в ютф-8), корректно очистить от всех символов кроме букв (латинских русских, цифр, пробела и знаков . , ; : ( ) * & ^ % $ # @ ! + = _ - ? №

Автор: arto 28.6.2010, 12:50
для utf8 смотреть классы символов.
perldoc perlunicode etc.

Автор: antananarivu 28.6.2010, 15:29
Я понимаю, что напрашиваюсь на грубость. Но в том то и дело что с английским у меня очень плохо. читал. много непонятных вещей. жаль тратить неделю а то  больше на все тонкости, поэтому и обращаюсь к спецам. ведь в общем-то нужна всего 1 конкретная задача.
строку текста в ютэфной кодировке избавить от всех символов, кроме приведенных выше. 1 строка кода. 
заранее спасибо.

Автор: arto 28.6.2010, 17:27
дайте закодированную строку.

Автор: antananarivu 28.6.2010, 17:39
Строка($sp) - "=?utf-8?B?0J/QviDQtNC+0LrRg9C80LXQvdGC0YMg0KHQvdGP0YLQuNC1INC30LA=?=
    =?utf-8?B?0LrQsNC30LAg4oSWIDEwwqAxMjUg0L7RgiAwNy4wNi4yMDEwIDE3OjEyOjIwINGB?=
    =?utf-8?B?0L3Rj9GC0Ysg0YHQu9C10LTRg9GO0YnQuNC1ICDQv9C+0LfQuNGG0LjQuC4uLi4=?=
    =?utf-8?B?ICA=?=
"

После 

Код

my $sp = decode_mimewords($subject);
my $charset = Lingua::DetectCharset::Detect($sp);
$sp = Convert::Cyrillic::cstocs($charset, 'UTF8', $sp);


Получаем строку: 

"По документу Снятие заказа № 10 125 от 07.06.2010 17:12:20 сняты следующие  позиции....  
"

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

Код

$sp=~ s/[^\ A-Za-z0-9\а\б\в\г\д\е\ё\ж\з\и\й\к\л\м\н\о\п\р\с\т\у\ф\х\ц\ч\ш\щ\ъ\ы\ь\э\ю\я\А\Б\В\Г\Д\Е\Ё\Ж\З\И\Й\К\Л\М\Н\О\П\Р\С\Т\У\Ф\Х\Ч\Ц\Ш\Щ\Ъ\Ы\Ь\Э\Ю\Я\.\,\;\:\(\)\*\&\^\%\$\#\@\!\+\=\_\-\№\?]//g;


После чего $sp не конкатенируется, на экран не выводится. То есть продолжать корректно работать со строкой становится невозможно!
Если же вывести строку в файл то между "№ 10"  и "125" видны некий нечитаемый символ (квадратик). Если же строку "По документу Снятие заказа № 10 125 от 07.06.2010 17:12:20 сняты следующие  позиции.... " скопипастить в Word то на этом самом месте мы увидим символ неразравного пробела. Не знаю важно это или нет, говорю как понимаю ситуацию. 

Ну и собствено вопрос, почему регулярное выражение некорректно работает. 

Автор: ginnie 28.6.2010, 17:59
antananarivu, возможно, проблема в use bytes. Попробуйте use Devel::Peek; и Dump($sp) до и после удаления лишних символов. Кстати, попробуйте еще 
Код

{
    no bytes;
    $sp=~ s/[^\ A-Za-z0-9\а\б\в\г\д\е\ё\ж\з\и\й\к\л\м\н\о\п\р\с\т\у\ф\х\ц\ч\ш\щ\ъ\ы\ь\э\ю\я\А\Б\В\Г\Д\Е\Ё\Ж\З\И\Й\К\Л\М\Н\О\П\Р\С\Т\У\Ф\Х\Ч\Ц\Ш\Щ\Ъ\Ы\Ь\Э\Ю\Я\.\,\;\:\(\)\*\&\^\%\$\#\@\!\+\=\_\-\№\?]//g;
}  

Автор: krypt3r 29.6.2010, 06:34
use bytes уберите, в ней проблема. И добавьте use utf8

Автор: arto 29.6.2010, 10:56
[^ \p{S}\p{L}\p{N}\p{P}]+ ?

Автор: antananarivu 29.6.2010, 11:32
делал 
no bytes - тогда убивает и русские буквы тоже. 
use utf-8 или use Devel::Peek - кривой символ остается, строка не выводится на экран. 

Код

$spasss=~ s/[^ \p{S}\p{L}\p{N}\p{P}]+ ?//g; 


тот же результат - некий кривой символ остается. 

Автор: antananarivu 29.6.2010, 11:48
Может быть я вообще не верно формулирую проблему. 
после того как я отчистил переменную $sp
я делаю следующее:
Код

my $tt2 = "select dbmail_properties.mytest('insert into dbmail_properties.log(namen,fromn,date,subject,kolvo,files,result,muid) values (''".$supplier."'',''".$from."'',''".$date."'',''".$sp."'',''".$nooatt."'',''".$filestr."'',''".$result."'',''".$muid."'');') as val;";
my $rv2 = spi_exec_query($tt2);
my $nname2 = $rv2->{rows}[0]->{val};


если я не отчищаю переменную $sp все корректно отрабатывает - если отчищаю строка $tt2 не выводится на печать и insert не срабатывает.


Автор: ginnie 29.6.2010, 11:48
Цитата(antananarivu @  29.6.2010,  11:32 Найти цитируемый пост)
no bytes - тогда убивает и русские буквы тоже.

А русские символы в регулярном выражении в скрипте у Вас в какой кодировке?

Цитата(antananarivu @  29.6.2010,  11:32 Найти цитируемый пост)
use Devel::Peek - кривой символ остается, строка не выводится на экран

Что выводит Dump($sp)?

Автор: antananarivu 29.6.2010, 11:54
А русские символы в регулярном выражении в скрипте у Вас в какой кодировке?

Вы меня переоцениваете. Не знаю. Учитывая, что в самом начале кода стоит 'use bytes' - не знаю.

Dump($sp) - если на экране - пустоту. не отображает. 

Автор: ginnie 29.6.2010, 12:09
antananarivu, чтобы работало правильно, файл должен быть в кодировке utf8 (указывается в редакторе), и нужно использовать там-же, где no bytes; - use utf8;

Цитата(antananarivu @  29.6.2010,  11:54 Найти цитируемый пост)
Dump($sp) - если на экране - пустоту. не отображает. 

"На экране" подразумевается в консоли?
Команда perl -MDevel::Peek -e 'Dump(12)' у меня выводит 
Код

SV = IV(0x61b978) at 0x6002e8
  REFCNT = 1
  FLAGS = (IOK,READONLY,pIOK)
  IV = 12


а у Вас?

Автор: antananarivu 29.6.2010, 12:14
Код

$BODY$

use strict;
use warnings;
use MIME::Parser;
use MIME::Entity;
use MIME::Body;
use MIME::QuotedPrint;
use MIME::Base64;
use Text::Iconv;
use MIME::Words qw(:all); 
use Convert::Cyrillic;  
use Lingua::DetectCharset;

use bytes;


my $header = $entity->head;
$subject = $header->get('Subject');

my $sp = decode_mimewords($subject);
my $charset = Lingua::DetectCharset::Detect($sp);
$sp = Convert::Cyrillic::cstocs($charset, 'UTF8', $sp);
$sp=~ s/[^\ A-Za-z0-9\а\б\в\г\д\е\ё\ж\з\и\й\к\л\м\н\о\п\р\с\т\у\ф\х\ц\ч\ш\щ\ъ\ы\ь\э\ю\я\А\Б\В\Г\Д\Е\Ё\Ж\З\И\Й\К\Л\М\Н\О\П\Р\С\Т\У\Ф\Х\Ч\Ц\Ш\Щ\Ъ\Ы\Ь\Э\Ю\Я\.\,\;\:\(\)\*\&\^\%\$\#\@\!\+\=\_\-\№\?]//g; 
       
my $tt2 = "select dbmail_properties.mytest('insert into dbmail_properties.log(namen,fromn,date,subject,kolvo,files,result,muid) values (''0'',''0'',''0'',''".$sp."'',''0'',''0'',''0'',''0'');') as val;";
my $rv2 = spi_exec_query($tt2);
my $nname2 = $rv2->{rows}[0]->{val};
  
return 1;
$BODY$

  

Весь текст программы. Оставил, то что относится к $sp.

Добавлено @ 12:20
Так... консоли у меня нет. Я сижу через pgAdmin и резалты вижу либо через 'return $sp' в результатах вывода.
Либо записывая переменную в текстовый файл. 

как указать в редакторе что файл в utf8?


uses bytes я оставил, потому что при конкатенации строк часто получались иероглифы. и этот рецепт я нашел где-то на форуме.

Автор: antananarivu 29.6.2010, 12:35
Код

use utf8 (no bytes);
$sp=~ s/[^\ A-Za-z0-9\а\б\в\г\д\е\ё\ж\з\и\й\к\л\м\н\о\п\р\с\т\у\ф\х\ц\ч\ш\щ\ъ\ы\ь\э\ю\я\А\Б\В\Г\Д\Е\Ё\Ж\З\И\Й\К\Л\М\Н\О\П\Р\С\Т\У\Ф\Х\Ч\Ц\Ш\Щ\Ъ\Ы\Ь\Э\Ю\Я\.\,\;\:\(\)\*\&\^\%\$\#\@\!\+\=\_\-\№\?]//g; 

use bytes;


пробовал. 

Автор: ginnie 29.6.2010, 12:39
antananarivu, вот Вам вариант

Код

use MIME::Words qw(:all);

my ($str) = decode_mimewords('=?koi8-r?B?7sHLzMHEzsHRIzU2mjc3NV/u5evz9Ozh6u4ueGxz?=');
my $utf8_str = decode($str->[1], $str->[0]);
$utf8_str =~ s{[^ \p{S}\p{L}\p{N}\p{P}]}{}g;
my $tt2 = "select dbmail_properties.mytest('insert into dbmail_properties.log(namen,fromn,date,subject,kolvo,files,result,muid) values (''0'',''0'',''0'',''".$utf8_str."'',''0'',''0'',''0'',''0'');') as val;";
my $rv2 = spi_exec_query($tt2);
my $nname2 = $rv2->{rows}[0]->{val};

Автор: arto 29.6.2010, 12:42
странно, у меня работает:

$VAR1 = "\x{41f}\x{43e} \x{434}\x{43e}\x{43a}\x{443}\x{43c}\x{435}\x{43d}\x{442}\x{443} \x{421}\x{43d}\x{44f}\x{442}\x{438}\x{435} \x{437}\x{430}\x{43a}\x{430}\x{437}\x{430} \x{2116} 10\x{a0}125 \x{43e}\x{442} 07.06.2010 17:12:20 \x{441}\x{43d}\x{44f}\x{442}\x{44b} \x{441}\x{43b}\x{435}\x{434}\x{443}\x{44e}\x{449}\x{438}\x{435}  \x{43f}\x{43e}\x{437}\x{438}\x{446}\x{438}\x{438}....  ";

$VAR1 = "\x{41f}\x{43e} \x{434}\x{43e}\x{43a}\x{443}\x{43c}\x{435}\x{43d}\x{442}\x{443} \x{421}\x{43d}\x{44f}\x{442}\x{438}\x{435} \x{437}\x{430}\x{43a}\x{430}\x{437}\x{430} \x{2116} 10125 \x{43e}\x{442} 07.06.2010 17:12:20 \x{441}\x{43d}\x{44f}\x{442}\x{44b} \x{441}\x{43b}\x{435}\x{434}\x{443}\x{44e}\x{449}\x{438}\x{435}  \x{43f}\x{43e}\x{437}\x{438}\x{446}\x{438}\x{438}....  ";

первое -- до, второе -- после.

\x{a0} удалено, \x{2116} осталось.

Автор: antananarivu 29.6.2010, 12:53
Код

my $sp = decode_mimewords($subject);
my $utf8_str = decode($sp->[1], $sp->[0]);
$utf8_str =~ s{[^ \p{S}\p{L}\p{N}\p{P}]}{}g;
$sp = $utf8_str;
my $tt2 = "select dbmail_properties.mytest('insert into dbmail_properties.log(namen,fromn,date,subject,kolvo,files,result,muid) values (''0'',''0'',''0'',''".$sp."'',''0'',''0'',''0'',''0'');') as val;";
my $rv2 = spi_exec_query($tt2);
my $nname2 = $rv2->{rows}[0]->{val};



так?

если так то ошибка такая: "ERROR:  error from Perl function "saveattachments": Can't use string ("По документу Снят") as an ARRAY ref while "strict refs" in use at line 119."


line 119 "my $utf8_str = decode($spasss->[1], $spasss->[0]);" 


Автор: ginnie 29.6.2010, 13:03
antananarivu, 

Код

my ($sp) = decode_mimewords($subject);


от того, что Вы написали отличается контекстом: в моем варианте контекст списочный, а не скалярный, как у Вас, из-за этого ошибка, т.к. decode_mimewords() в списочном и скалярном контекстах возвращает разные результаты.

Автор: antananarivu 29.6.2010, 13:19
ладно. по-моему это безнадежно. то же самое
до этого
$sp =~ s{[^ \p{S}\p{L}\p{N}\p{P}]}{}g;

return $sp работает отлично
после нет.

Добавлено через 9 минут и 16 секунд
при этом длина строки если брать length меняется на 2 байта. 139 - 137. то есть удалить то она символ удаляет

Автор: ginnie 29.6.2010, 13:56
antananarivu, если не сложно, пишите, чтобы было понятно не только Вам, но и остальным. Что именно у Вас не работает?
У меня в тестовом примере в консоль выводит Накладная#56775_НЕКСТЛАЙН.xls и Dump() тоже никаких лишних символов не показывает:
Код

SV = PV(0x7599e8) at 0x600ef8
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8)
  PV = 0x79a680 "\320\235\320\260\320\272\320\273\320\260\320\264\320\275\320\260\321\217#56775_\320\235\320\225\320\232\320\241\320\242\320\233\320\220\320\231\320\235.xls"\0 [UTF8 "\x{41d}\x{430}\x{43a}\x{43b}\x{430}\x{434}\x{43d}\x{430}\x{44f}#56775_\x{41d}\x{415}\x{41a}\x{421}\x{422}\x{41b}\x{410}\x{419}\x{41d}.xls"]
  CUR = 47
  LEN = 56


Автор: antananarivu 29.6.2010, 13:57
Что-то с русскими символами...

потому что если убрать русские буквы и оставить например:

Код

$sp=~ s/[^\ A-Za-z0-9\.\,\;\:\(\)\*\&\^\%\$\#\@\!\+\=\_\-\№\?]//g; 


то все корректно отображается (русские буквы конечно оказываются удалены, что очевидно). 

Автор: ginnie 29.6.2010, 14:02
antananarivu, где у Вас проблемы с русскими буквами? в базе? база какую кодировку использует?

Автор: antananarivu 29.6.2010, 14:08
Закроем тему. Не могу корректно объяснить. На том уровне, на котором я мог объяснить, я объяснил: 

Код

$sp = "По документу Снятие заказа № 10 125 от 07.06.2010 17:12:20 сняты следующие  позиции....";



return $sp

Вывод данных: "По документу Снятие заказа № 10 125 от 07.06.2010 17:12:20 сняты следующие  позиции...."

Код

$sp = "По документу Снятие заказа № 10 125 от 07.06.2010 17:12:20 сняты следующие  позиции....";
$sp=~ s/[^\ A-Za-z0-9\а\б\в\г\д\е\ё\ж\з\и\й\к\л\м\н\о\п\р\с\т\у\ф\х\ц\ч\ш\щ\ъ\ы\ь\э\ю\я\А\Б\В\Г\Д\Е\Ё\Ж\З\И\Й\К\Л\М\Н\О\П\Р\С\Т\У\Ф\Х\Ч\Ц\Ш\Щ\Ъ\Ы\Ь\Э\Ю\Я\.\,\;\:\(\)\*\&\^\%\$\#\@\!\+\=\_\-\№\?]//g;


return $sp

Вывод данных: (визуально пустая строка)

ТЕПЕРЬ!!! Убираем символ стоящий между 10 и 125 имеем:

Код

$sp = "По документу Снятие заказа № 10125 от 07.06.2010 17:12:20 сняты следующие  позиции....";



return $sp

Вывод данных: "По документу Снятие заказа № 10125 от 07.06.2010 17:12:20 сняты следующие  позиции...."

Код

$sp = "По документу Снятие заказа № 10125 от 07.06.2010 17:12:20 сняты следующие  позиции....";
$sp=~ s/[^\ A-Za-z0-9\а\б\в\г\д\е\ё\ж\з\и\й\к\л\м\н\о\п\р\с\т\у\ф\х\ц\ч\ш\щ\ъ\ы\ь\э\ю\я\А\Б\В\Г\Д\Е\Ё\Ж\З\И\Й\К\Л\М\Н\О\П\Р\С\Т\У\Ф\Х\Ч\Ц\Ш\Щ\Ъ\Ы\Ь\Э\Ю\Я\.\,\;\:\(\)\*\&\^\%\$\#\@\!\+\=\_\-\№\?]//g;


return $sp

Вывод данных:  "По документу Снятие заказа № 10125 от 07.06.2010 17:12:20 сняты следующие  позиции...."


Автор: ginnie 29.6.2010, 14:24
antananarivu, покажите еще вывод функции Dumper() для второго случая, когда выводится пустая строка

Код

use Data::Dumper;
return Dumper($sp); 

Автор: gcc 29.6.2010, 14:28
antananarivu, 

Код

use Encode;
            $value= Encode::decode( 'utf8', $value);

Автор: antananarivu 29.6.2010, 14:39
error from Perl function "saveattachments": Undefined subroutine &main::dumper called at line 323.
если делаю return Dump($sp); - выкидывает с сервера. 

Автор: ginnie 29.6.2010, 14:47
antananarivu, вы Dumper() с большой буквы написали, а то в сообщении об ошибке с маленькой?

Автор: antananarivu 29.6.2010, 15:14
Dumper($sp);

return - визуально пустая строка

вывел в файл:

Автор: antananarivu 30.6.2010, 08:49
Как вообще получить строку вот в таком виде?
$VAR1 = "\x{41f}\x{43e} \x{434}\x{43e}\x{43a}\x{443}\x{43c}\x{435}\x{43d}\x{442}\x{443} \x{421}\x{43d}\x{44f}\x{442}\x{438}\x{435} \x{437}\x{430}\x{43a}\x{430}\x{437}\x{430} \x{2116} 10125 \x{43e}\x{442} 07.06.2010 17:12:20 \x{441}\x{43d}\x{44f}\x{442}\x{44b} \x{441}\x{43b}\x{435}\x{434}\x{443}\x{44e}\x{449}\x{438}\x{435}  \x{43f}\x{43e}\x{437}\x{438}\x{446}\x{438}\x{438}....  

Автор: arto 30.6.2010, 08:53
print Dumper \$str;

Автор: antananarivu 30.6.2010, 09:20
А если избавится от регулярного выражения вообще и написать что то типа:

 
Код

IF @c >='A' and @c<='Z'  or @c>='А' and @c<='Я' or @c>='0' and @c<='9'   SELECT @s = @s + @c

Автор: antananarivu 30.6.2010, 11:10
Вот так до и после. Вывел через return Dumper ($sp) - переменная типа bytea

"$VAR1 = '\320\237\320\276 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\203 \320\241\320\275\321\217\321\202\320\270\320\265 \320\267\320\260\320\272\320\260\320\267\320\260 \342\204\226 10\302\240125 \320\276\321\202 07.06.2010 17:12:20 \321\201\320\275\321\217\321\202\321\213 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\270\320\265  \320\277\320\276\320\267\320\270\321\206\320\270\320\270....  \012';\012"

"$VAR1 = '\320\237\320\276 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\203 \320\241\320\275\321\217\321\202\320\270\320\265 \320\267\320\260\320\272\320\260\320\267\320\260 \342\204\226 10\240125 \320\276\321\202 07.06.2010 17:12:20 \321\201\320\275\321\217\321\202\321\213 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\270\320\265  \320\277\320\276\320\267\320\270\321\206\320\270\320\270....  ';\012"

то есть честно удаляет \302 - видимо неразрывный пробел и \012 в конце.
тогда я вообще не понимаю в чем причина

Автор: ginnie 30.6.2010, 16:15
antananarivu, обратите внимание, что у Вас строка в UTF8 и символ, который Вы хотите удалить \302\240, а удаляется только его часть \302.

Добавлено через 3 минуты и 7 секунд
Покажите строчку после обработки этим регулярным выражением

Код

$sp =~ s{[^ \p{S}\p{L}\p{N}\p{P}]}{}g;

Автор: antananarivu 1.7.2010, 10:01
Проблема решена. Всем спасибо (особенно ginnie). 
Честно говоря так и не понял, что делал неправильно.. но главное заработало. Помогло следующее:

Код

use utf8;
use MIME::Words qw(:all); 
use Convert::Cyrillic;  
use Lingua::DetectCharset;


my $ttr = "=?koi8-r?B?8NLJyM/EIDUyMTM5OSDEzNEgIOLBztrByiDP1CAyMDEwLjA2LjA3IA==?=
    =?koi8-r?B?LSAxMzozOSAgKDYyKQ==?=
";
my $ttr2 = decode_mimewords($ttr);
my $charset = Lingua::DetectCharset::Detect($ttr2);
my $ttr3 = Convert::Cyrillic::cstocs($charset, 'UTF8', $ttr2);
utf8::decode($ttr3);
utf8::upgrade($ttr3);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)