|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Victor Wagner 2:5020/400 28 Nov 2002 21:57:03 To : Andrey Sapozhnikov Subject : Re: KOI2utf8 -------------------------------------------------------------------------------- Andrey Sapozhnikov <sapa@icb.chel.su> wrote: >> >> Согласен. Это гораздо более практически полезная задача ПРЕДСТАВЛЕHИЯ >> строки, которая легко и естественно представляется в юникоде, средствами >> 8-битной кодировки + HTML. Буде будет такое решение, я, естественно, >> попробую адаптировать его к другим языкам, которые позволяют средставми >> 8-битной кодировки выразить более другие символы - TeX, Perl, Tcl. >> Если сложность адаптации будет соответствовать прямизне представления >> этих символов в более другом языке, сделаю вывод, что в 5.8 перле >> работа с кодировками сделана УДОБHО. AS> ======================== example ========================== AS> #!/usr/bin/perl -w AS> use strict; AS> BEGIN { AS> use utf8; AS> package Encode::myhtml; AS> use base qw(Encode::Encoding); AS> __PACKAGE__->Define('myhtml'); AS> my %subst = ( AS> '&' => '&', '<' => '<', '>' => '>', '"' => '"', AS> "\x{00a0}" => ' ', "\x{2014}" => '—', "\x{00df}" => 'ss' AS> ); AS> sub encode ($$;$) { AS> (my $str = $_[1]) =~ s/([&<">\x{0080}-\x{ffff}])/$subst{$1} || AS> $1/ge; $_[1] = '' if $_[2]; Encode::encode('koi8-r', $str, AS> Encode::FB_HTMLCREF); } }; AS> use utf8; AS> use encoding 'utf8', STDOUT => 'myhtml'; Что в этом решении мне не нравится - так это то, что его нужно модифицировать для каждой новой кодировки. Я хотел универсального решения - чтобы можно было самому решать, что делать именно с символами отсутствующими в указанной целевой кодировке. Hа самом деле я хотел чего-то вот такого: my %subst=("\x{2014}"=>"—", "\x{00DF}"=>"ss", ); sub encode_to_html ($$) { my ($encoding,$string) = @_; my $octets = ""; while ($string) { $octets .= Encode::encode( $encoding,$string,Encode::FB_QUIET); my $char = substr($string,0,1); $string = substr($string,1); if (exists $subst{$char}) { $octets.= $subst{$char} ; } else { $octets .= sprintf "%04X;",ord($char); } } return $octets; } У меня почему-то FB_QUIET ведет себя не как написано, а немедленно возвращает пустую строку не модифицируя входные данные, да еще и ругается при этом на STDERR. Можно, конечно, воспользоваться FB_PERLQQ, а потом глобальной заменой s/\\x\{(nnnn)\}/subst_function($1)/g. -- http://www.communiware.ru http://www.ice.ru/~vitus --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/151786e0cf302.html, оценка из 5, голосов 10
|