【发布时间】:2016-11-05 00:33:52
【问题描述】:
我想我使用 LWP::Simple::get 不正确,但我不知道如何纠正它。我的第一次尝试很简单
perl -e 'use LWP::Simple; print get("http://localhost/wtf.txt");'
,但这不起作用。 wtf.txt 包含单个 UTF-8 编码字符 u+00f6(即 ö)。使用wget 和xxd 我确保HTTP 服务器发送正确的标题行Content-Type: text/plain; charset=utf-8 并且内容符合预期。但上面的 perl 代码却将u+00f6 作为 ISO-8859-1-encoded 返回。
我认为这是一个简单的编码问题,但通过简单的修复,我发现它并不像我希望的那样简单。我使用单个 UTF-8 编码字符 u+30e4(即 ヤ)创建了第二个文件 wtf2.txt,并使用以下 perl 代码获取了这两个文件:
#!/usr/bin/perl
use LWP::Simple;
$wtf=get("http://localhost/$ARGV[0]");
$wtf2=pack("H*",unpack("H*",$wtf));
print $wtf;
print "\n";
print $wtf2;
print "\n$wtf\n$wtf2\n";
print (unpack("H*",$wtf)."\n");
在获取 wtf.txt 时,此代码以 ISO-8859-1 编码的形式写入 4 次 u+00f6,然后是 f6(其 ISO-8859-1 编码的十六进制形式)。到这里,一切都和以前一样。但是在获取wtf2.txt 时,此代码以UTF-8 编码形式写入u+30e4,然后是ISO-8859-1 中的u+00e4(即ä)、UTF-8 中的u+30e4、@987654342 @ in UTF-8, e4 (ISO-8859-1 of u+00e4 in hex)。
鉴于 u+30e4 和 u+00e4 彼此无关,除了后者是前者的位掩码/截断版本,我希望不仅重新编码发生在 LWP::Simple 内部,而且一些截断。我倾向于向 LWP::Simple 提交错误报告,但我仍然希望得到一个简单的修复和/或解释。
顺便说一句,如果我将第二行和第三行替换为 $wtf=<>; 并简单地从 stdin 读取文件而不是通过 LWP::Simple::get 获取它们,则不会出现上述问题。
我在 Debian 7 上使用 perl 5.14.2 和 libwww 6.04 对此进行了测试。
【问题讨论】:
标签: perl libwww-perl