UTF-8和LibXML :: Reader不正确

时间:2016-08-08 14:10:32

标签: xml perl utf-8

我有一个来自远程源的大型XML文件,它说它是'UTF8',文件显示我们-ascii。

<?xml version="1.0" encoding="utf-8"?>...

file -bi <file> indicates application/xml; charset=us-ascii
Encode::Guess indicates UTF8

编辑:还有一些代码在文件中读取,最初是从LWP获取的...我也尝试在这里强制进行一些编码,但是得到其他错误,如宽字符。

my $fh = IO::File->new;
$fh->open( '<' . $filename )
$content = join '', <$fh>;

我正在使用XML :: Reader

my $reader = XML::LibXML::Reader->new(string => $content) or die qq(cannot read content: $!);

while ($reader->nextElement($template->{ 'item' } )) {
    my $copy = $reader->copyCurrentNode(1);
    my $test = $copy->findvalue( 'description' )
...# do other stuff with $copy

大部分内容都可以正常使用。但是,看起来有一些无效的utf-8或格式错误的数据,因为它会在中途发生错误。
(注意,在XML :: Bare中,整个xml被处理'很好',因为它更宽容,但是文件是在内存大小的限制,所以我需要一个更小的内存xml解析器。)

Entity: line 64070: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0x1A 0x73 0x20 0x73

如果我在上次成功之后查看vim,我可以看到

^Z  or <^Z>  26,  Hex 1a,  Octal 032 with :ascii in vim

我看了here on SO尝试确保至少有效的UTF-8,因为我无法修复原点,并尝试...

use Encode qw( encode decode );
my $octets = decode('UTF-8', $content, Encode::FB_DEFAULT );
$content = encode('UTF-8', $octets, Encode::FB_CROAK );

但我仍然得到同样的错误。我很高兴跳过任何包含无效UTF-8的部分,但整个解析器都会死掉,我看不到任何方法可以在以后进行处理(我认为应该在XML解析时发生)。

我的问题是,这是保证UTF-8的最佳方式(假设我无法更改文件),或者是否有一种方法可以解决错误(我可能正则表达特定的char,但我假设以后可能会有其他类似的问题,所以感觉笨重)?

1 个答案:

答案 0 :(得分:1)

错误消息具有误导性;这个问题与编码 [1] 无关。事实上,我收到的错误是以下 [2]

:1: parser error : PCDATA invalid Char value 26

来自XML规范,

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

U + 001A可能不合法地出现在XML文件中,甚至不能作为字符引用(&#x1A;)。

  

使用字符引用must引用的字符与Char的生成匹配。

如果文件要包含二进制数据,则应对二进制部分进行编码(例如,使用base64)。

  1. 1A2073都小于80

  2. 我使用XML :: LibXML而不是XML :: LibXML :: Reader进行测试,但我怀疑相关的区别实际上是XML :: LibXML或libxml2版本的差异。

相关问题