2017-10-17 72 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。