|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 28 Nov 2002 20:40:56 To : Victor Wagner Subject : Re: KOI2utf8 -------------------------------------------------------------------------------- Victor Wagner wrote: > AS> Victor Wagner wrote: >>>И что, преобразование >>> >>>"\x2020Сегодня\xA0\x2014 Geschlo\xDFen" -> >>>"†Сегодня — Geschlossen" сделает? >>> >>>Очень бы хотел посмотреть решение на 5.8 перле, которое при >>>преобразовании в 8-битный чарсет позволяет вызывать свою функцию >>>преобразования на все символы, отсутствующие в выходной перекодировке. >>> >>>В экран уместишь?' >> > > AS> Эээ... давай разберемся по-порядку. Во-первых, что это за строка No.1? > AS> Она изначально в какой кодировке - в utf8? И как трактуются \xNNNN ? > AS> Как chr(NN) . 'NN'? Ибо в perl уникодные символы в строке записываются > > Hу извини. Я слишком неопытен в работе с юникодом в перле, поэтому > не написал там фигурных скобок. Я имел в виду: > > "\x{2020}Сегодня\x{A0}\x{2014} Geschlo\x{DF}en" > > Результат может быть в любой восьмибитной кодировке, в которой нет > символов EM-DASH, BULLET и западно-европейских акцентированных букв. > Hапример, в кои-8. С неразрывным пробелом там призовая игра, ибо он в > кодировки есть. > > AS> как \x{NNNN}. И в какой кодировке Вы хотите результат? Ибо то, что > AS> я вижу вообще не есть перекодировка чарсетов. > > Согласен. Это гораздо более практически полезная задача ПРЕДСТАВЛЕHИЯ > строки, которая легко и естественно представляется в юникоде, средствами > 8-битной кодировки + HTML. Буде будет такое решение, я, естественно, > попробую адаптировать его к другим языкам, которые позволяют средставми > 8-битной кодировки выразить более другие символы - TeX, Perl, Tcl. > Если сложность адаптации будет соответствовать прямизне представления > этих символов в более другом языке, сделаю вывод, что в 5.8 перле > работа с кодировками сделана УДОБHО. ======================== example ========================== #!/usr/bin/perl -w use strict; BEGIN { use utf8; package Encode::myhtml; use base qw(Encode::Encoding); __PACKAGE__->Define('myhtml'); my %subst = ( '&' => '&', '<' => '<', '>' => '>', '"' => '"', "\x{00a0}" => ' ', "\x{2014}" => '—', "\x{00df}" => 'ss' ); sub encode ($$;$) { (my $str = $_[1]) =~ s/([&<">\x{0080}-\x{ffff}])/$subst{$1} || $1/ge; $_[1] = '' if $_[2]; Encode::encode('koi8-r', $str, Encode::FB_HTMLCREF); } }; use utf8; use encoding 'utf8', STDOUT => 'myhtml'; print "\x{2020}пєп№пЁпОп¶пЧяЮ\x{A0}\x{2014} Geschlo\x{DF}en"; ======================== eof ========================== Вот, пожалуйста. Можно было описать свой UCM файл с кодировкой, но поскольку это по большей части повторение уже имеющейся koi8-r я решил (ценой некоторого падения скорости) класс с кодировкой написать на perl, а не в виде XS. Hадеюсь, что в твой экран оно влезет. Разумеется все, что обернуто в BEGIN впоследствии надо вынести в отдельный Encode/myhtml.pm который сам вызовется при необходимости. То, что стоит в print - это и есть твоя строка. К сожалению, гейт fido7 не разрешает (насколько я помню) слать письма в utf-8, посему я пишу в koi-8 и вставляю код AS IS. Если что-то поломается - открой скрипт любым редактором поддерживающим utf-8 и поправь строчку :) Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/657770ce42c0.html, оценка из 5, голосов 10
|