これはPerlの問題か、Nginxの問題か、HTTPの問題か分かりません。私はキャラクターのエンコーディングに関するバズの質問があることを知っていますが、私はこれを理解できません。とにかく、ここに問題があります。nginxとperlによる文字エンコーディング
私のウェブサイトは、2つの異なる種類のソースからデータを取得します。これらのソースの中には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であることを示すことを含む、標準Content-typeヘッダーを出力します。
次に、文字ñを含むutfでエンコードされたファイルにスラップします(その上にチルダを付けた "n")。その文字を出力します。ソースファイル自体はhttps://www.mikobiko.com/utf-8.txtにあります。ここではLinuxの「ファイル」、そのファイルのためのコマンドの出力です:
utf-8.txt: UTF-8 Unicode text, with no line terminators
はその後スクリプトは、その出力を、nの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
この問題の解決に役立つ情報が他にもある場合はお知らせください。ありがとう!