使用nginx和perl编码字符
问题描述:
我不确定这是Perl问题,Nginx问题还是HTTP问题。我知道有关于字符编码的bazillion问题,但我无法弄清楚这一点。无论如何,这是问题所在。使用nginx和perl编码字符
我的网站从两种不同类型的来源提取数据。其中一些来源是utf-8文件。其中一些是包含URL编码数据的文件。问题是,我无法弄清楚如何从这两个源输出字符,而不会在Web浏览器中出现时髦的字符。
下面的Perl脚本演示了这个问题。您可以在https://www.mikobiko.com/demo.pl
#!/usr/bin/perl -wT
use strict;
use CGI;
# variables
my ($in, $from_file, $from_url);
# HTTP header
print qq|Content-type: text/html; charset=utf-8\n\n|;
# from utf-8 file
open($in, '<', './utf-8.txt');
$in or die $!;
($from_file) = <$in>;
print "<h1>from utf-8 file</h1>\n";
print "<p>character: ", $from_file, "</p>\n";
print '<p>length: ', length($from_file), "</p>\n";
# from url encoded
print "<h1>from url encoded</h1>\n";
$from_url = '%F1';
$from_url = CGI::unescape($from_url);
print "<p>character: ", $from_url, "</p>\n";
print '<p>length: ', length($from_url), "</p>\n";
看到这个剧本的生活和行动这里是这个脚本的作用。它输出一个标准的内容类型标题,包括指示字符集是utf-8。
然后它在包含字符ñ(一个“n”与一个代字号在它上面)的utf编码文件中流淌。然后输出该字符。你可以在https://www.mikobiko.com/utf-8.txt看到源文件本身。下面是该文件的linux“file”命令输出:
utf-8.txt: UTF-8 Unicode text, with no line terminators
然后脚本解码URL的字符串,然后输出它。
下面是浏览器显示的屏幕截图。这个屏幕截图来自Chrome,但Firefox做同样的事情。来自utf-8文件的字符以小问号符号显示。
如果删除了内容类型的“字符集= UTF-8”的部分,则该问题被反转,并且URL解码字符被显示时髦。
这里的一些信息:
nginx的:nginx的/ 1.10.3(Ubuntu的)
的Perl:Perl 5中,版本22,颠覆1(v5.22.1)
的Linux服务器上:
Distributor ID: Ubuntu
Description: Ubuntu 16.04.2 LTS
Release: 16.04
Codename: xenial
请让我知道,如果有任何其他信息我可以提供帮助解决这个问题。谢谢!
答
好的,所以我想通了。在URL被解码后,它需要被编码为utf-8。首先加载编码模块:
use Encode 'encode';
然后编码字符串:
$from_url = encode('UTF-8', $from_url);
易peasy。