perl - 为什么 Perl 的 LWP 给我的编码与原始网站不同?

标签 perl content-encoding lwp windows-1255

假设我有这个代码:

use strict;
use LWP qw ( get );

my $content = get ( "http://www.msn.co.il" );

print STDERR $content;

错误日志显示类似“\xd7\x9c\xd7\x94\xd7\x93\xd7\xa4\xd7\xa1\xd7\x94”
我猜它是 utf-16 吗?

该网站的编码是
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1255">

那么为什么会出现这些字符而不是 windows-1255 字符呢?

而且,另一个奇怪的事情是我有两台服务器:

第一个服务器返回 CP1255 字符,我可以简单地将其转换为 utf8,
而当前的服务器给了我这些字符,我不能用它做任何事情......

apache/perl/module 中是否有任何配置文件弄乱了编码?
强制某事...?

我的网站在第二台服务器上的结果是 perl 文件和标题都是 utf8,所以当我写的文本不是英文字符时,上面例子中的内容显示正常(即使它是奇怪的 utf 字符) 但我自己的静态文本看起来像 "×ס'××ר××:"

我测试的另一件事是......

通过 perl:
my $content = `curl "http://www.anglo-saxon.co.il"`;    

我得到utf8编码。

通过 Bash:
curl "http://www.anglo-saxon.co.il"

在这里我得到了 CP1255(Windows-1255)编码......

还,
当我在 bash 中运行脚本时 - 它给出了 CP1255,当我通过网络运行它时 - 然后它又是 utf8 ......

通过将内容从 utf8 更改为应该更改的内容,然后返回到 utf8,从而解决了该问题:
use Text::Iconv;

my $converter = Text::Iconv->new("utf8", "CP1255");
   $content=$converter->convert($content);

my $converter = Text::Iconv->new("CP1255", "utf8");
   $content=$converter->convert($content);

最佳答案

所有这些手动编码和解码都是不必要的。当 HTML 说页面是在 windows-1255 中编码时,它在骗你;服务器说它正在提供 UTF-8,它是。责怪微软的 HTML 生成工具。

无论如何,由于服务器确实返回了正确的编码,所以这是有效的:

my $response = LWP::UserAgent->new->get("http://www.msn.co.il/");
my $content = $res->decoded_content;
$content现在是一个 perl 字符串,可以做任何你需要的事情。如果要将其转换为其他编码,请调用 Encode::encode对它是合适的;不要使用 Encode::decode因为它已经被解码一次。

关于perl - 为什么 Perl 的 LWP 给我的编码与原始网站不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2341128/

相关文章:

perl - 基于核心转储对 Perl 脚本进行逆向工程

perl - 向原型(prototype)添加可选参数

regex - 为什么命令行中 s/g 的以下变体是错误的?

http - 是否可以使用内容编码 : gzip in a HTTP POST request?

webserver - 服务器端 GZipping 如何工作?

perl - 如何在不使用 :content_file option? 的情况下将响应作为文件处理

regex - 当用户输入右侧时,将 ee 修饰符安全地与 s///运算符一起使用

c - 如何在不使用 zlib 库的情况下在 C 编程中使用 gzip 编码

perl - 为什么我不能使用 LWP::Simple 获取维基百科页面?

linux - 脚本无法正确获取