Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с кодировками. Регулярные выражения. UTF-8. 
:(
    Опции темы
antananarivu
Дата 29.6.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



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

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

Dump($sp) - если на экране - пустоту. не отображает. 
PM MAIL   Вверх
ginnie
Дата 29.6.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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


а у Вас?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
antananarivu
Дата 29.6.2010, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



Код

$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:22
PM MAIL   Вверх
antananarivu
Дата 29.6.2010, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



Код

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

use bytes;


пробовал. 

Это сообщение отредактировал(а) antananarivu - 29.6.2010, 12:35
PM MAIL   Вверх
ginnie
Дата 29.6.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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};


Это сообщение отредактировал(а) ginnie - 29.6.2010, 12:50


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
arto
Дата 29.6.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



странно, у меня работает:

$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} осталось.
PM MAIL ICQ   Вверх
antananarivu
Дата 29.6.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



Код

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]);" 


PM MAIL   Вверх
ginnie
Дата 29.6.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



antananarivu, 

Код

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


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


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
antananarivu
Дата 29.6.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



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

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

Добавлено через 9 минут и 16 секунд
при этом длина строки если брать length меняется на 2 байта. 139 - 137. то есть удалить то она символ удаляет
PM MAIL   Вверх
ginnie
Дата 29.6.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
antananarivu
Дата 29.6.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



Что-то с русскими символами...

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

Код

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


то все корректно отображается (русские буквы конечно оказываются удалены, что очевидно). 
PM MAIL   Вверх
ginnie
Дата 29.6.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
antananarivu
Дата 29.6.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



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

Код

$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 сняты следующие  позиции...."



Это сообщение отредактировал(а) antananarivu - 29.6.2010, 14:17
PM MAIL   Вверх
ginnie
Дата 29.6.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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

Код

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



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 29.6.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



antananarivu, 

Код

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

PM WWW ICQ Skype GTalk Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.