Perl HTML::实体的意外行为
我是Perl的HTML::Entities例程Perl HTML::实体的意外行为,perl,unicode,character-encoding,ascii,Perl,Unicode,Character Encoding,Ascii,我是Perl的HTML::Entities例程decode_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!)