2017-10-17 8 views
1

이것이 Perl 문제인지, Nginx 문제인지 또는 HTTP 문제인지 확실하지 않습니다. 나는 문자 인코딩에 대해 bazillion 질문이 있다는 것을 알고 있지만, 나는 이것을 알아낼 수 없다. 어쨌든, 여기 문제가 있습니다.nginx 및 perl로 문자 인코딩

내 웹 사이트는 두 가지 유형의 출처에서 데이터를 가져옵니다. 그 소스 중 일부는 utf-8 파일입니다. 일부는 URL 인코딩 된 데이터가 포함 된 파일입니다. 문제는 웹 브라우저에서 펑키 한 문자를 가져 오지 않고 두 출처의 문자를 출력하는 방법을 알아낼 수 없다는 것입니다.

다음 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에서 확인할 수 있습니다. 여기에 해당 파일에 대한 리눅스 "파일"명령 출력입니다 :

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 (우분투)

펄 : 펄 5 버전 (22), 서브 버전 1 (v5.22.1)

리눅스 서버에서 다음

일부 시스템 정보입니다 :

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); 

쉬워요합니다.