이것이 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 파일에있는 문자는 작은 물음표 기호와 함께 표시됩니다.
내가 콘텐츠 형식의 "문자 집합 = 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
이 문제를 해결하는 데 도움이되는 정보가 있으면 알려주십시오. 감사!