如何在perl中正确显示HTML实体

如何在perl中正确显示HTML实体,html,perl,html-entities,Html,Perl,Html Entities,我正在使用PERL编写一个web爬虫程序,当我试图使用HTML::Entities::decode_Entities显示字符串时,我意识到有一种奇怪的行为 我处理的字符串包含中文字符和类似于Jìngyè的字符串。 我使用HTML::Entities::decode_Entities来解码汉字,效果很好。但是,当字符串不包含中文字符时,字符串会奇怪地显示(J�ngy�). 我编写了一个小代码来测试两个字符串上的不同行为 字符串1是“No.22,J�ngy� 台湾台北市钟山区第三路10466号”和第

我正在使用PERL编写一个web爬虫程序,当我试图使用HTML::Entities::decode_Entities显示字符串时,我意识到有一种奇怪的行为

我处理的字符串包含中文字符和类似于Jìngyè的字符串。 我使用HTML::Entities::decode_Entities来解码汉字,效果很好。但是,当字符串不包含中文字符时,字符串会奇怪地显示(J�ngy�).

我编写了一个小代码来测试两个字符串上的不同行为

字符串1是“No.22,J�ngy� 台湾台北市钟山区第三路10466号”和第二条为“台湾台北市钟山区第104号”�ngy� 第三路20号號".

下面是我的代码:

print "before: $1\n";
my $decoded = HTML::Entities::decode_entities($1."&#34399");#I add the last character just for testing
print "decoded $decoded\n";
my $chopped = substr($decoded, 0, -1);
print "chopped: $chopped\n";
以下是我的结果:

之前:第22号,J�ngy� 台湾台北市中山区三路10466号

解码地址:台湾台北市钟山区兴义三路22号,邮编:10466號 (正确)

第22号,J�ngy� 台湾台北市钟山区三路10466(不正确)

前:台湾台北市中山区J�ngy� 第三路20号號

解码104台湾台北市琼山区琼瑶三路20号號號 (正确)

切碎:台湾台北市中山区兴义三路104号20號 (正确)

有人能解释一下为什么会这样吗? 以及如何解决这个问题,使我的字符串能够正确显示

多谢各位

对不起,我没有把问题说清楚,下面是我写的代码,URL是:


首先,始终使用
使用严格;使用警告;

问题是您没有对输出进行编码。文件句柄只能传输字节,但您传递的是解码文本

当您传递明显错误的内容时,Perl将输出UTF-8(-ish)。
chr(0x865F)
显然不是字节,因此:

$ perl -we'print "\xE8\x{865F}\n"'
Wide character in print at -e line 1.
è號
$ perl -we'print "\xE8\n"'
�
但有些地方出了问题并不总是很明显。
chr(0xE8)
可能是一个字节,因此:

$ perl -we'print "\xE8\x{865F}\n"'
Wide character in print at -e line 1.
è號
$ perl -we'print "\xE8\n"'
�
将值转换为一系列字节的过程称为“序列化”。序列化文本的具体情况称为字符编码

Encode的
Encode
用于提供字符编码。您还可以使用模块自动调用
Encode


你看了吗?你输入的实体是什么样子的?你的示例在框中显示了无效字符;也许这就是所有的解释?也许你需要在like&;entity;中键入它们,以便标记不会吃掉它们。对不起,� 在J�ngy� 已经是替换字符,您因处理不当而破坏了字符串。请显示完整代码,以便我们可以自己重现问题。特别有趣的是,
$1
是如何填充的,以及它与::Dump()一起转储时的样子。抱歉,信息是使用LWP->decoded_内容从网站提取的。而$1是使用简单正则表达式获取的。