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


Автор: les 6.5.2008, 22:09
Вот такой код

Код

use strict;

use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'utf8');
setlocale(LC_ALL, 'utf8');

open INF , '<cp.txt';
    #open (OF , '>', $_[1]);
    open OFILE , '>utf.txt';
    while (<INF>)
        {
           #print; 
           $_=Encode::encode('utf8', Encode::decode('cp1251', $_));
           print OFILE $_;
        }


При прогоне через Komodo файл utf.txt создается как положено, а при консольном запуске того же файла, той же версией Perl получается пустой... Че подправить надо? Подскажите плиз...

Автор: les 6.5.2008, 22:47
Лана.. всё.. 
добавил

use Encode 

и в консоли тож запахало... но почему в IDE не ругался и работал.... не приятно.

Автор: les 7.5.2008, 11:46
Вопрос такого плана...
Есть ли какие органичение на использование рег.выраж с utf8???
Потому как если например в переменной $my будет строка в Юникоде, то после 
Код

$my=~ s/(\w+)//;
 она преврящается а набор крякозябр. Локаль использую в utf8, исполняемый pl тоже в юникоде....
Можно ли как это побороть, либо есть пути обхода этой проблемы....

Автор: JUmPER 7.5.2008, 16:13
Код

use utf8;

Автор: les 7.5.2008, 19:34
Цитата(JUmPER @ 7.5.2008,  16:13)
Код

use utf8;

Не, не помогло...
вот это пример 
Код

use strict;

my $news= "Пресс-секретарь президента France Presse.";
$news=~ s/(?:\d*|_)//g;
        #$news[$i]=~ tr/[А-Я]/[а-я]/;
            
        my @temp_word;
        while ( $news=~ s/(\w+)//)
            {
                #$temp_word[$i] = $1;
                push (@temp_word,$1);
            }


в $news уходит тольео France и Presse , как это исправить? 
Всё тут в UTF8 и сам скрипт, и само данные...

Автор: tolkien 7.5.2008, 20:44
попробуй из utf8->acsii
обработать рег выражением
результат из acsii->utf8

Автор: konstant1n 7.5.2008, 20:50
для начала, как у же сказали 
Код

 use utf8;


далее, если мне не изменяет память, то \w  это word-character для ASCII, для юникода надо использовать классы символов, вроде
p{Letter} и тд.   Подробнее см сюды http://www.regular-expressions.info/unicode.html

И еще:   судя по коду задача разбить некий текст на слова.  Вы ищите последовательность букв и считаете это словом.  Как насеет сокращений "т.д." , емайл адресов,
слов "через-тире" и проч?    Чтоб не возится с кучей исключений лучше разделять по пробелам, более точно по white-space.  Все что не white-space до следующего white-space это слово.   Обычно еще перед этим проходятся по тексту убирают white-space вначале/вконце текста и в самом тексте меняют мultiple white-space -> single white-space ( s/\s+/\s/g; )

Автор: les 7.5.2008, 21:59
Цитата(konstant1n @ 7.5.2008,  20:50)



И еще:   судя по коду задача разбить некий текст на слова.  Вы ищите последовательность букв и считаете это словом.  Как насеет сокращений "т.д." , емайл адресов,
слов "через-тире" и проч?    Чтоб не возится с кучей исключений лучше разделять по пробелам, более точно по white-space.  Все что не white-space до следующего white-space это слово.   Обычно еще перед этим проходятся по тексту убирают white-space вначале/вконце текста и в самом тексте меняют мultiple white-space -> single white-space ( s/\s+/\s/g; )

Да... Спасибо, про спец символы вроде правда.... и \w будет тогда \p{IsWord}

По поводу разбора.... Я привел пример такой, чтоб было видно на чем застрял..
Я текс из html выдергиваю, поэтому он проходит несколько степеней очистки.

Автор: JUmPER 8.5.2008, 09:26
с директивой use utf8 \w изменяется для обработки уникода.

кстати, если в коде есть не латинские буквы (я про кирилицу в рег выражении), то было бы здорово сохранить исходник в соответствующй кодировке (utf8).

Автор: shamber 8.5.2008, 09:36
было бы здорово сохранить исходник в соответствующй кодировке (utf8)
JUmPER
не внимательно читаете smile
Цитата(les @  7.5.2008,  11:46 Найти цитируемый пост)
 Локаль использую в utf8, исполняемый pl тоже в юникоде....



Автор: amg 8.5.2008, 16:02
Цитата(JUmPER @  8.5.2008,  09:26 Найти цитируемый пост)
с директивой use utf8 \w изменяется для обработки уникода.
Что-то я засомневался, ведь, судя по документации, use utf8 должно влиять только на интерпретацию перлом текста скрипта, и решил проверить.
Код
use Encode;
use utf8;

# Слово "текст" во внутреннем представлении perl (в юникоде)
$text = "\x{0442}\x{0435}\x{043A}\x{0441}\x{0442}";

# Проверка
$str = encode('KOI8-R', $text);
print "$str\n";

$str = $text;
print "Unicode:\n";
print "\\w         OK\n" if $str =~ /^\w{5}$/;
print "\\p{IsWord} OK\n" if $str =~ /^\p{IsWord}{5}$/;

$str = encode("utf8", $text);
print "UTF8:\n";
print "\\w         OK\n" if $str =~ /^\w{5}$/;
print "\\p{IsWord} OK\n" if $str =~ /^\p{IsWord}{5}$/;
Результат
Код
текст
Unicode:
\w         OK
\p{IsWord} OK
UTF8:
То же самое получается и без use utf8;
Вывод: документация, вроде, не врет, use utf8; не влияет на распознавание букв.

Приятным сюрпризом для меня оказалось, что кириллические буквы в юникоде подходят \w даже без use locale. Хотя сейчас вспомнил, что об этом уже говорилось здесь.

Чтобы работать со строками в предсавлении UTF8, их сначала нужно декодировать.

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