LINUX.ORG.RU

regexp-ы в perl для работы с русскими буквами в юникоде — как?

 , ,


1

2

UPDATE: видимо ответ — это http://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-b... поэтому отмечаю задачу как решенную; но если кто-то хочет дополнить или исправить то-что-по-ссылке — welcome (в частности, пока что не выяснилось, как чекнуть файл на соответствие utf8) _____________________________________________________________________

проблема в том, что 0xD0, которое префикс русской буквы, съедается, и получается бред:

20 20 20 B1  D0 B0 D0 B7  D0 B5 20 D1  82 D0 B8 D0

видимо это из-то того, что у меня регекспы для замены включают и русские, и латинские буквы

в консоли:

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

вероятно, есть простой рецепт (скажем, utf-16), как в таких условиях правильно рабтать, поэтому я жду, что мне его подскажут и не пишу что за регекспы и не пытаюсь в них найти виновного в этом безобразии

можно, в принципе, конвертнуть все в CP1251 (сразу насчет КОИ-8: там [а-я] емнип не даст русский алфавит), но хотелось бы оставаться в юникоде

попытка подать перлу -C7 привела к тому, что он начал бредить постоянно, а не точечно, как сейчас

★★★★★

Последнее исправление: www_linux_org_ru (всего исправлений: 2)
Ответ на: комментарий от www_linux_org_ru

Просто смотри:

1. perl хранит строки в своем формате

2. если ты используешь в коде программы русские буквы и у тебя локаль utf8, то лучше сообщить об этом перлу: use utf8;

3. при чтении строк из файла хорошо бы указывать кодировку

soomrack ★★★★★
()

Шебанг #/usr/bin/perl -CS попробуйте

disarmer ★★★
()
Ответ на: комментарий от www_linux_org_ru

Но Perl-то об этом не знает! Для него часть текста - байты, а часть - символы UTF-8.

AITap ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

На примере покажи. Типа

#!/usr/bin/perl -w
use utf8;
my $str = $ARGV[0];
$str ~= s/qwer/фцувы/;
print $str;

./program.pl qwer

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

написал use utf8; — стало еще хуже

#!/usr/bin/perl -W

use utf8;

в целом, не хочется заниматься поиском кривых регекспов — т.е. да, я понимаю, что можно случайно 0xD0 задеть, но вопрос: есть ли ПРОСТОЙ РЕЦЕПТ чтобы такого не случалось (все в ср1251 по-моему простой рецепт, но хочется utf все-таки)

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

Блин. Ты можешь показать что и как ты делаешь? Пока ты только сказал «У меня проблемы с utf8 в perl». Но как ты их получил — хз. Ты мог криво открыть файл, ты мог начать писать байты напрямую в строку-переменную, считая, что она в utf8, ты мог подать через stdin хрень и т.д.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

Но как ты их получил — хз.

последний раз говорю — я тебя не спрашиваю, как я их получил

я спрашиваю, что мне сказать перлу, чтобы их не получать (при условии, что дальше я себя веду вменяемо)

Ты мог криво открыть файл

STDIN открывал перл, не я

ты мог начать писать байты напрямую в строку-переменную, считая, что она в utf8

не пишу — только регекспы

ты мог подать через stdin хрень и т.д.

скажи, как чекнуть файл на соответствие утф8

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

скажи, как чекнуть файл на соответствие утф8

cat file.txt | enca

STDIN открывал перл, не я

а кто скажет в какой кодировке перлу воспринимать stdin ?

binmode( STDIN, ':utf8' );

binmode( STDOUT, ':utf8' );

т.к. не стоит забывать, что вывод тоже должен быть в utf8, может у тебя только вывод неправильно делается.

http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/perl_unicode_en

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 1)
Ответ на: комментарий от x3al

В очередной раз пощу эту ссылку, первый ответ, 7 советов сверху.

примерно такое я хотел увидеть

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

STDIN открывал перл, не я

binmode STDIN, ":utf8"; # декодировать текст из STDIN из байтов в символы
binmode STDOUT, ":utf8"; # кодировать текст в STDOUT из символов в байты (иначе будет warning: wide character in print)
use utf8; # декодировать программу (=> регекспы) из байтов в символы

AITap ★★★★★
()
Ответ на: комментарий от soomrack
$ cat 5.txt | enca
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.
www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

А должно быть «Universal transforamtion format 8 bits; UTF-8»

soomrack ★★★★★
()

в частности, пока что не выяснилось, как чекнуть файл на соответствие utf8

use Encode;
decode (utf8 => do { open my $fh, «<», $file; local $/; <$fh> }, Encode::FB_CROAK|Encode::LEAVE_SRC);


Бросит исключение, если данные не удалось раскодировать как UTF-8. Другие значения последнего аргумента дадут другое поведение.

AITap ★★★★★
()
Ответ на: комментарий от AITap

желательно привести полный скрипт вместе со всеми ключами, use-ами, binmode..., который, скажем, читает STDIN, копирует его на STDOUT вплоть до первого символа, который не удалось распарсить как утф-8, и сообщает на STDERR позицию этого символа (я боюсь, что какой-нить binmode пропущу, и все пойдет наперекосяк)

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

з.ы. а вообще я все внимательно прочту и возможно задам свой вопрос точнее

www_linux_org_ru ★★★★★
() автор топика
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от www_linux_org_ru

Вероятно там имеется в виду «use feature 'unicode_strings'». perldoc feature.
Поддержка unicode появилась в 5.6.0

Olegymous ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.