Вопрос любителям перла и юникода
Feb. 8th, 2006 04:25 pmБерем xml файл
====================================================
<?xml version="1.0" encoding="UTF-8"?> <root> <p>«English Text»</p> <p>«Русский текст»</p> </root>====================================================
берем скрипт
====================================================
#!/usr/bin/perl
use strict;
use XML::DOM;
my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile ('test.xml');
$doc->printToFile ('result.xml');====================================================На выходе теряем кавычки в английском тексте
====================================================
<?xml version="1.0" encoding="UTF-8"?> <root> <p>English Text</p> <p>«Русский текст»</p> </root>====================================================
Если смотреть на файл результата в кодировке KOI-8
====================================================
<?xml version="1.0" encoding="UTF-8"?> <root> <p>╚English Text╩</p> <p>б╚п═я.я.я.п╨п╦п╧ я.п╣п╨я.я.б╩</p> </root>====================================================
То видно, что кавычки не то чтобы совсем теряются, а просто отображаются каким-то другим символом, который в последствии при открытие файла нормальным utf-8 редактором игнорируется...
Можете ли вы это как-то конструктивно прокомментировать... Чья это проблема? Перла, XML::DOM'а? Куда копать?
У меня perl v5.8.4 XML::DOM v1.43. Какие еще версии привести -- я не знаю...
Приведенные выше текста можно быстро скачать здесь
http://shaplov.ru/files/utf-8_PerlTest.tgz
чтобы не мучатся с копипастом.
no subject
Date: 2006-02-08 01:59 pm (UTC)А если вместо _«_ поставить _"_ ?
no subject
Date: 2006-02-08 02:44 pm (UTC)Символы не должныпропадать без предупреждения...
Это недопустимо! ;-)
no subject
Date: 2006-02-08 06:19 pm (UTC)no subject
Date: 2006-02-08 07:48 pm (UTC)no subject
Date: 2006-02-09 08:03 am (UTC)Wide character in print at /usr/lib/perl5/5.8.5/i386-linux-thread-multi/IO/Handle.pm line 399.
Поэтому тут не XML виноват, а IO:Handle.
no subject
Date: 2006-02-09 08:02 pm (UTC)Вдумчивый дебаг показал, что кавычка теряется вот в этой процелдуре XML::DOM:
sub encodeText
{
my ($str, $default) = @_;
return undef unless defined $str;
if ($] >= 5.006) {
$str =~ s/([$default])|(]]>)/
defined ($1) ? $DecodeDefaultEntity{$1} : "]]>" /egs;
}
else {
$str =~ s/([\xC0-\xDF].|[\xE0-\xEF]..|[\xF0-\xFF]...)|([$default])|(]]>)/
defined($1) ? XmlUtf8Decode ($1) :
defined ($2) ? $DecodeDefaultEntity{$2} : "]]>" /egs;
}
#?? could there be references that should not be expanded?
# e.g. should not replace nn; ¯ and &abc;
# $str =~ s/&(?!($ReName|#[0-9]+|#x[0-9a-fA-F]+);)/&/go;
$str;
}
Буду курить мануал, чтобы понять почему...
no subject
Date: 2006-02-09 08:17 pm (UTC)