Perl HTML::实体的意外行为

Perl HTML::实体的意外行为,perl,unicode,character-encoding,ascii,Perl,Unicode,Character Encoding,Ascii,我是Perl的HTML::Entities例程decode_Entities()的新手 转换新闻媒体网站上的标题 这是一个很好的结果: 之前:德克萨斯大陪审团澄清计划生育,起诉原告 之后:德克萨斯大陪审团澄清计划生育,起诉原告 但这里有一个令人困惑的结果: 之前:犹他州可能会发生重大变化’;中国的刑事司法系统 之后:犹他州的刑事司法系统可能会发生重大变化 请注意,’代码未转换为单个引号,未解码为空格,与第一个示例不同 发生了什么?第一个示例和第二个示例之间的区别在于,第一个示

我是Perl的HTML::Entities例程
decode_Entities()
的新手 转换新闻媒体网站上的标题

这是一个很好的结果:

之前:
德克萨斯大陪审团澄清计划生育,起诉原告

之后:
德克萨斯大陪审团澄清计划生育,起诉原告

但这里有一个令人困惑的结果:

之前:
犹他州可能会发生重大变化’;中国的刑事司法系统

之后:
犹他州的刑事司法系统可能会发生重大变化

请注意,
代码未转换为单个引号,
未解码为空格,与第一个示例不同


发生了什么?

第一个示例和第二个示例之间的区别在于,第一个示例不包含255以上的任何代码点,而第二个示例包含255以上的代码点。因此,第一个字符串可以根据系统的本机8位字符集显示(很可能是ISO 8859-1/拉丁语1),但第二个字符串不能。根据,其原因是“使用255以上的代码点意味着整个字符串使用Unicode”

因为现在字符串中有Unicode字符,所以需要正确编码文本以供输出,否则会看到“奇怪的字符”(就像示例中的字符一样!)。由于您没有提供,我不确定您的输出方法是什么,但是让我们假设
STDOUT
使事情变得简单。有两种不同的方法可以将文本编码为八位字节流:

  • 手动,使用模块
  • 自动,使用正确的I/O层
  • 我更喜欢第二种选择,因为它不那么乏味。为此,我们只需调用
    STDOUT

    use strict;
    use warnings;
    use HTML::Entities;
    
    my $str = 'Big changes could be coming to Utah’s criminal justice system';
    my $decoded = decode_entities($str);
    
    binmode(STDOUT, ':encoding(UTF-8)');
    printf("%s\n%vx\n", $decoded, $decoded);
    
    输出:

    $ perl foo.pl
    Big changes could be coming to Utah’s criminal justice system
    42.69.67.20.63.68.61.6e.67.65.73.20.63.6f.75.6c.64.20.62.65.20.63.6f.6d.69.6e.67.20.74.6f.20.55.74.61.68.2019.73.20.63.72.69.6d.69.6e.61.6c.20.6a.75.73.74.69.63.65.a0.73.79.73.74.65.6d
    
    您可以看到在字符
    68
    73
    (分别为h和s)之间有一个
    2019
    (),在
    65
    73
    之间也有一个
    a0
    (),即e和s


    除了前面提到的参考,如果您有兴趣了解更多关于Perl如何处理Unicode和字符编码的信息,您还应该阅读(简短!)。

    第一个示例和第二个示例之间的区别在于,第一个示例不包含255以上的任何代码点,而第二个示例包含255以上的代码点。因此,第一个字符串可以根据系统的本机8位字符集显示(很可能是ISO 8859-1/拉丁语1),但第二个字符串不能。根据,其原因是“使用255以上的代码点意味着整个字符串使用Unicode”

    因为现在字符串中有Unicode字符,所以需要正确编码文本以供输出,否则会看到“奇怪的字符”(就像示例中的字符一样!)。由于您没有提供,我不确定您的输出方法是什么,但是让我们假设
    STDOUT
    使事情变得简单。有两种不同的方法可以将文本编码为八位字节流:

  • 手动,使用模块
  • 自动,使用正确的I/O层
  • 我更喜欢第二种选择,因为它不那么乏味。为此,我们只需调用
    STDOUT

    use strict;
    use warnings;
    use HTML::Entities;
    
    my $str = 'Big changes could be coming to Utah’s criminal justice system';
    my $decoded = decode_entities($str);
    
    binmode(STDOUT, ':encoding(UTF-8)');
    printf("%s\n%vx\n", $decoded, $decoded);
    
    输出:

    $ perl foo.pl
    Big changes could be coming to Utah’s criminal justice system
    42.69.67.20.63.68.61.6e.67.65.73.20.63.6f.75.6c.64.20.62.65.20.63.6f.6d.69.6e.67.20.74.6f.20.55.74.61.68.2019.73.20.63.72.69.6d.69.6e.61.6c.20.6a.75.73.74.69.63.65.a0.73.79.73.74.65.6d
    
    您可以看到在字符
    68
    73
    (分别为h和s)之间有一个
    2019
    (),在
    65
    73
    之间也有一个
    a0
    (),即e和s

    除了前面提到的参考资料之外,如果您有兴趣进一步了解Perl如何处理Unicode和字符编码,还应该阅读(short!)