2014-09-22 31 views
1

我有以下的CGI腳本斌:如何在perl cgi-bin腳本中使用utf-8?

#! /usr/bin/perl 
# 

use utf8; 

use CGI; 
my $q = CGI->new(); 
my %params = $q->Vars; 

print $q->header('text/html'); 

$w = $params{"words"}; 

print "$w\n"; 

我希望能夠稱其爲的cgi-bin/script.pl字= E例如,但是當我這樣做,有什麼印刷不UTF-8,而不是亂碼:

É 

有什麼辦法可以用utf8使用cgi-bin嗎?

+3

如果你沒有在你的頭文件中指定'-charset',你會得到默認的'ISO-8859-1'。你應該也可以在'STDOUT'上設置一個編碼。 – tjd 2014-09-22 19:51:10

回答

6

您的行use utf8不會爲您做任何事情,除了在源文件本身中允許使用UTF-8字符。您必須確保輸出句柄(位於STDOUT以及任何文件)設置爲utf8。處理這個問題的一個簡單方法是utf8::all模塊。另外,請確保您發送的是正確的標題,並使用CGI附註將輸入參數視爲UTF-8。最後,一如既往,一定要使用嚴格和警告。

下面應該讓你開始:

#!/usr/bin/perl 

use strict; 
use warnings; 

use utf8::all; 
use CGI qw(-utf8); 

my $q = CGI->new; 
print $q->header("text/html;charset=UTF-8"); 
print $q->param("words"); 

exit; 
1

你會爲自己節省很多痛苦的,從長遠來看,如果你通過閱讀perlunitutperlunicode文檔頁面開始了。他們將爲您提供關於Unicode和字符編碼的基本知識,以及如何在Perl中使用它們。

此外,你要求的是比你想象的更復雜。在「使用cgi-bin和utf8」這個短語中隱藏了許多圖層,從您的界面開始,您可以使用任何工具將請求發送到Web服務器,並以該工具已解析響應並將其呈現給您的方式結束。您需要足夠好地理解所有這些圖層,以便至少能夠確定問題是否存在於CGI腳本中。例如,如果問題是bashcurl不同意您的命令行參數的編碼,那麼它對您的腳本完美工作沒有幫助。

1

我一直有這個問題,我的CGI腳本的utf8編碼間歇性失敗。 我嘗試了一切,但無法可靠地重複該問題。

我終於發現,是絕對關鍵的伴隨你使用CGI

使用CGI QW每個模塊使用UTF8編譯要一致(-utf8);

似乎發生的事情是modperl每個請求只調用一次CGI模塊。如果包含CGI模塊的不一致 - 比如說一些只使用重定向功能的實用程序功能,並且您沒有打算設置utf8編譯指示。然後這個調用可以是modperl決定用來解碼請求的那個調用。