假设我有这个代码:
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/