我有一个来自远程源的大型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,但我假设以后可能会有其他类似的问题,所以感觉笨重)?
答案 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文件中,甚至不能作为字符引用(
)。
使用字符引用
must
引用的字符与Char的生成匹配。
如果文件要包含二进制数据,则应对二进制部分进行编码(例如,使用base64)。
1A
,20
和73
都小于80
。
我使用XML :: LibXML而不是XML :: LibXML :: Reader进行测试,但我怀疑相关的区别实际上是XML :: LibXML或libxml2版本的差异。