PerlXML::解析器编码问题

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 (

我正在编写一个Perl脚本,需要从XML文件中提取一些数据

XML文件本身使用UTF-8编码。然而,出于某种原因,我从文件中提取的内容最终被编码为ISO-8859-1。文档中指出,传递给我的处理程序的内容应该是UTF-8,但事实并非如此

解析器基本上是这样的:

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,“打开的文件
    $data->{$curId}{$curField}
    是否打开了utf8标志


    如果将utf8标志为on的字符串与utf8标志为off的字符串连接起来,Perl会将后者转换为Unicode。这是常见问题的根源。

    我知道您已经在注释中找到了Michel的答案,但我要补充几点。对于任何编码,您都必须严格了解自己在接受什么和接受什么如果你需要一些东西,不要依赖环境;最终会有其他人使用你的程序,并有一个糟糕的环境

    在读取文件时,不要使用“:utf8”层。这与八位字节是否为UTF-8无关:

     open my $fh, '<:encoding(UTF-8)', $filename or ...;
    
    在命令行中,您可以使用带S标志的-C开关使标准句柄UTF-8:

     perl -CS input.xml
    

    Tom Christiansen.

    刚刚尝试过,对我来说似乎很好(WinXP上的ActivePerl 5.12)。您可以检查
    $string
    是否用
    使用utf8;utf8::is_utf8($string)标记为UTF-8
    。如果您得到正确答案,那么接下来的处理可能会出现问题。您确定它在ISO-8859-1中吗?您是如何测试的?因为如果您对任何未在utf-8模式下打开的文件(例如STDOUT或STDERR)使用
    打印
    ,并且您的字符在ISO-8859-1范围内,那么默认情况下Perl会将它们转换为ISO-8859-1(为了兼容性)。您可以使用
    binmode STDOUT,“:utf8”
    确保STDOUT上不会发生转换。这确实是问题所在-我不知道我必须更改STDOUT的模式,并假设它符合我的区域设置。谢谢大家。
     perl -CS input.xml