2017-10-17 204 views
1

我不确定这是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文件的字符以小问号符号显示。

enter image description here

如果删除了内容类型的“字符集= 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 

请让我知道,如果有任何其他信息我可以提供帮助解决这个问题。谢谢!

回答

1

好的,所以我想通了。在URL被解码后,它需要被编码为utf-8。首先加载编码模块:

use Encode 'encode'; 

然后编码字符串:

$from_url = encode('UTF-8', $from_url); 

易peasy。