Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Регулярные выражения, Regexp::Common и UTF-16


Автор: Даниил 18.7.2006, 00:17
Вопрос в следующем:

Вот есть некий фрагмент кода
==
use Regexp::Common qw[Email::Address];
  use Email::Address;
  ...
  ...
  my $text = read_textfile($fullpath);

   ###ищем e-mail'ы   в файле
   my (@found) = ($text=~ m/($RE{Email}{Address})/g);
   my (@addrs) = map $_->address,
                      Email::Address->parse("@found");

  ##ищем числа в файле
  my (@d) = ($text =~m/(\d+)/g);
  
###Функция считывания из файла
sub read_textfile
{
  my $filename = $_[0];
  my $str = '';
  my @arr;

  if (open(TEXT_FILE, $filename))
  {
     @arr = <TEXT_FILE>;
     close(TEXT_FILE);
  }
  else
  {
     print "error reading $filename : $! <BR>";
  }
  return join('',@arr);

}

==

Всё работает хорошо, если мы имеем обычный ANSI-файл. 

А если файл записан в UTF-16, то ничего не работает. Вопрос - что нужно, чтобы регулярные выражения и Regexp::Common работали и в UTF-16?


Документацию по работе с Unicode в Perl читал, но не очень понял, как же быть именно с моим случаем.

Автор: nitr 18.7.2006, 02:29
можно perldoc Encode отличный модуль ;) (имхо самый практичный)
можно также читать юникод через файлов. манипулятор:
Код

open TEXTFILE, "<:encoding(UTF-16)", $filename; #чтение

и совет по поводу метода чтения файла, который ты использовал... поиск на форуме поможет найти "лучший" вариант ;) 

Автор: Даниил 18.7.2006, 12:47
nitr, 
В случае, когда я пишу
open TEXTFILE, "<:encoding(UTF-16)", $filename; 

у меня из файла вообще ничего не считывается.
 

Автор: nitr 18.7.2006, 19:21
ну во-первых используем подсветку (благо отлично реализована на форуме)
я же изначально сказал, можно так же использовать модуль, для этого в командной строке выполнить:
perldoc Encode

а так... 
...
Код

...
use Encode qw(encode);
my $text = read_textfile($fullpath);
$text = encode('your_codename', $text);

а точно текст UTF-16 smile , может UTF-8, да и в какую кодировку тебе. Покажи кусочек файла в аски утф-16 smile

поиск на форуме, тут очень много уже обсуждали, а так читайте perldoc Encode 

Автор: Даниил 21.7.2006, 01:49
nitr, 
поиском на форуме искал. Про регулярные выражения и UTF-16 не нашёл.
Да, точно UTF-16, а не UTF8. На каждый символ под два байта, в т.ч. и латинские.
perldoc Encode прочитал. Опять-таки, как применить к регулярным выражениям - не нашёл. 

Автор: nitr 23.7.2006, 06:27
пока не пойму что и для чего... в регулярках зачем применять... работай с текстом, а потом кодируй и декодируй ;)
my $text = read_textfile($fullpath);
после этой строки обрабатывай переменную $text 

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