Ric*_*evi 3 perl content-encoding lwp windows-1255
让我说我有这个代码:
use strict;
use LWP qw ( get );
my $content = get ( "http://www.msn.co.il" );
print STDERR $content;
Run Code Online (Sandbox Code Playgroud)
错误日志显示类似"\ 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">
Run Code Online (Sandbox Code Playgroud)
那么为什么这些角色出现而不是windows-1255字符呢?
而另一个奇怪的事情是我有两台服务器:
第一台服务器返回CP1255字符,我可以简单地将其转换为utf8,当前服务器给我这些字符,我不能用它做任何事情......
apache/perl/module中是否有任何配置文件搞乱了编码?强迫某事......?
我的网站在第二台服务器上的结果是perl文件和标题都是utf8,所以当我写的文字不是英文字符时,上面例子中的内容显示正常(即使它是奇怪的字符) )但我自己的静态文本看起来像"×ס××××××:"
我测试的另一件事是......
通过perl:
my $content = `curl "http://www.anglo-saxon.co.il"`;
Run Code Online (Sandbox Code Playgroud)
我得到utf8编码.
通过Bash:
curl "http://www.anglo-saxon.co.il"
Run Code Online (Sandbox Code Playgroud)
在这里我得到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);
Run Code Online (Sandbox Code Playgroud)
所有这些手动编码和解码都是不必要的.当HTML表示页面在windows-1255中编码时,HTML就在骗你; 服务器说它正在服务UTF-8,它确实如此.归咎于Microsoft HTML生成工具.
无论如何,由于服务器确实返回了正确的编码,这有效:
my $response = LWP::UserAgent->new->get("http://www.msn.co.il/");
my $content = $res->decoded_content;
Run Code Online (Sandbox Code Playgroud)
$content现在是一个perl字符串,随时准备做你需要的任何事情.如果你想将它转换为其他编码,那么调用Encode::encode它是合适的; 千万不能使用Encode::decode,因为它是已经被解码的一次.
http://www.msn.co.il是UTF-8,并表示正确.字符串"\ xd7\x9c\xd7\x94\xd7\x93\xd7\xa4\xd7\xa1\xd7\x94"也是正确的UTF-8(להדפסה).我没有看到问题.
我认为你的第二个问题是由于你混合了不同的编码(UTF-8和Windows-1252).您可能希望正确编码/解码字符串.