nataraj: (Real Me)
[personal profile] nataraj
[livejournal.com profile] alexkuklin, пожалуйста опубликуй у себя ссылку, если проблема конечно не очевидная... а то у меня тут любителей перла раз два и обчелся...

Берем 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
чтобы не мучатся с копипастом.

Date: 2006-02-08 01:59 pm (UTC)
From: [identity profile] frederick-taer.livejournal.com
Я, конечно, не спец по перлу, но тебе принципиальны именно русские кавычки?
А если вместо _«_ поставить _"_ ?

Date: 2006-02-08 02:44 pm (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
Тут дело в принципе.
Символы не должныпропадать без предупреждения...
Это недопустимо! ;-)

Date: 2006-02-08 06:19 pm (UTC)
From: [identity profile] beldmit.livejournal.com
fido7.ru.perl

Date: 2006-02-08 07:48 pm (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
Спасибо. Задал...

Date: 2006-02-09 08:03 am (UTC)
From: [identity profile] sibskull.livejournal.com
У меня выдало ошибку:
Wide character in print at /usr/lib/perl5/5.8.5/i386-linux-thread-multi/IO/Handle.pm line 399.

Поэтому тут не XML виноват, а IO:Handle.

Date: 2006-02-09 08:02 pm (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
Нет. Иначе бы он терял все кавычки во всем текте... А этот теряет только некоторые.

Вдумчивый дебаг показал, что кавычка теряется вот в этой процелдуре 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;
}

Буду курить мануал, чтобы понять почему...

Date: 2006-02-09 08:17 pm (UTC)
From: [identity profile] beldmit.livejournal.com
В какой строчке?

Profile

nataraj: (Default)
Swami Dhyan Nataraj

July 2024

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 19th, 2026 08:30 pm
Powered by Dreamwidth Studios