PerlXML::解析器编码问题
我正在编写一个Perl脚本,需要从XML文件中提取一些数据 XML文件本身使用UTF-8编码。然而,出于某种原因,我从文件中提取的内容最终被编码为ISO-8859-1。文档中指出,传递给我的处理程序的内容应该是UTF-8,但事实并非如此 解析器基本上是这样的:PerlXML::解析器编码问题,xml,perl,encoding,utf-8,Xml,Perl,Encoding,Utf 8,我正在编写一个Perl脚本,需要从XML文件中提取一些数据 XML文件本身使用UTF-8编码。然而,出于某种原因,我从文件中提取的内容最终被编码为ISO-8859-1。文档中指出,传递给我的处理程序的内容应该是UTF-8,但事实并非如此 解析器基本上是这样的: my $parser = XML::Parser->new( Handlers => { # Some unrelated handlers here Char => sub { my (
my $parser = XML::Parser->new( Handlers => {
# Some unrelated handlers here
Char => sub {
my ( $expat, $string ) = @_;
if ( exists $data->{$curId}{$curField} ) {
$data->{$curId}{$curField} .= $string;
} else {
$data->{$curId}{$curField} = $string;
}
} ,
} );
我尝试了以下变体来进行实际解析:
- 直接通过
解析文件,无选项李>$parser->parsefile
- 直接通过
解析文件,使用$parser->parsefile
选项李>协议编码
- 使用
open($handle,“打开的文件
是否打开了utf8标志$data->{$curId}{$curField}
如果将utf8标志为on的字符串与utf8标志为off的字符串连接起来,Perl会将后者转换为Unicode。这是常见问题的根源。我知道您已经在注释中找到了Michel的答案,但我要补充几点。对于任何编码,您都必须严格了解自己在接受什么和接受什么如果你需要一些东西,不要依赖环境;最终会有其他人使用你的程序,并有一个糟糕的环境 在读取文件时,不要使用“:utf8”层。这与八位字节是否为UTF-8无关:
在命令行中,您可以使用带S标志的-C开关使标准句柄UTF-8:open my $fh, '<:encoding(UTF-8)', $filename or ...;
perl -CS input.xml
Tom Christiansen.刚刚尝试过,对我来说似乎很好(WinXP上的ActivePerl 5.12)。您可以检查
是否用$string
。如果您得到正确答案,那么接下来的处理可能会出现问题。您确定它在ISO-8859-1中吗?您是如何测试的?因为如果您对任何未在utf-8模式下打开的文件(例如STDOUT或STDERR)使用使用utf8;utf8::is_utf8($string)标记为UTF-8
,并且您的字符在ISO-8859-1范围内,那么默认情况下Perl会将它们转换为ISO-8859-1(为了兼容性)。您可以使用打印
确保STDOUT上不会发生转换。这确实是问题所在-我不知道我必须更改STDOUT的模式,并假设它符合我的区域设置。谢谢大家。binmode STDOUT,“:utf8”
perl -CS input.xml