我不確定這是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
請讓我知道,如果有任何其他信息我可以提供幫助解決這個問題。謝謝!