Perl: utf8 и format
От: Аноним  
Дата: 12.06.09 18:52
Оценка:
Здравствуйте! По ходу работы возникла небольшая задачка: в текстовом файле (обыкновенный plain text) необходимо разбить на строки, по 75 символов. Короче, отформатировать, так, как это делает какой-нибудь текстовый процессор. Я сразу вспомнил про (кто сказал — Word? ВОН ИЗ ПРОФЕССИИ!!!! ) Perl и его уникальный format. Увы, текст кириллический, и format "рвет" отдельные двубайтовые символы пополам, да и ширина строки получается не та, которая нужна.
use utf8 не помогает, равно как и такой шаманский приём:

binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';


Что делать? (с) Чернышевский
Re: Perl: utf8 и format
От: anonymous Россия http://denis.ibaev.name/
Дата: 15.06.09 11:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что делать? (с) Чернышевский


Код? Версия Perl?
Re[2]: Perl: utf8 и format
От: Аноним  
Дата: 15.06.09 11:29
Оценка:
Здравствуйте, anonymous, Вы писали:


A>Код? Версия Perl?


Да пожалуйста =(

perl 5.8.8

use warnings;
use strict;
use utf8;
use locale;

our $DATUM;

binmode DATA, ':utf8';
binmode STDOUT, ':utf8';

format HEAD =
.

format REPORT =
^<<<< ~~
$DATUM
.

$^ = 'HEAD';
$~ = 'REPORT';

while (<DATA>) {
    $DATUM = $_;
    write;
}

__DATA__
1
123
12345
12345 6789
123456789
1234 56789
АБВГДЕ
АБВГ ДЕЖЗ
АБВ ГДЕ ЖЗИ КЛМ


а результат:

1
123
12345
12345
6789
12345
6789
1234
56789
АБВГД
Е
АБВГ
ДЕЖЗ

АБВ
ГДЕ
ЖЗИ
КЛМ
М


Явно не то, чего ожидал... Последняя буква в каждой строке повторяется. В одной из строк (перед З) вылез какой-то непечатный символ
Re[3]: Perl: utf8 и format
От: anonymous Россия http://denis.ibaev.name/
Дата: 15.06.09 12:20
Оценка:
Здравствуйте, Аноним, Вы писали:
A>>Код? Версия Perl?
А>Да пожалуйста =(
А>perl 5.8.8
А>Явно не то, чего ожидал... Последняя буква в каждой строке повторяется. В одной из строк (перед З) вылез какой-то непечатный символ

На 5.10.0 то же самое. Это какая-то ошибка, выводится всякий мусор вслед за строкой. Я видел раньше описание, но решения не встречал.
Re: Perl: utf8 и format
От: Dair Россия https://dair.spb.ru
Дата: 18.06.09 07:54
Оценка:
Перед форматированием переводить текст в UTF16 и спокойно бить по два байта.
Боюсь, это единственный способ. А то завтра в программу запихнут шестибайтные символы и тут-то беда и настанет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.