2017-10-17 13 views
1

これは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ファイルからの文字は、小さな疑問符記号で表示されます。

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としてエンコードする必要があります。まずEncodeモジュールをロードします。

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

簡単peasy:

use Encode 'encode'; 

次に文字列をエンコードします。

関連する問題