2012-04-17 35 views
5

Sử dụng mã PerlLàm thế nào để loại bỏ CGI mặc định meta charset mã hóa trong Perl?

#!/usr/bin/perl 

use strict; 
use warnings; 
use CGI ":all"; 
use Encode; 

my $cgi = new CGI; 

$cgi->charset('utf-8'); 

print $cgi->header(-type => 'text/html', 
        -charset => 'utf-8'); 

print $cgi->start_html(-title => 'Test', 
         -head => meta({-http_equiv => 'Content-Type', 
             -content => 'text/html; charset=utf-8'})); 
my $text = 'test'; # for now 

Encode::from_to($text, 'latin1', 'utf8'); 

print $cgi->p($text); 
print $cgi->end_html; 

Tôi nhận được kết quả như sau:

Content-Type: text/html; charset=utf-8 

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> 
<head> 
<title>Test</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
</head> 
<body> 
<p>test</p> 
</body> 

Và tôi không biết tại sao

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

là trong đầu ra và tôi don 't biết làm thế nào để thoát khỏi nó.

Tất cả các đề xuất sẽ được đánh giá cao.

Trả lời

4

thêm một tham số -encoding để start_html và không xây dựng các yếu tố meta bằng tay. (mặc dù tài liệu CGI đề nghị bạn làm).

+0

+1 Cảm ơn bạn rất nhiều! –

+0

Điều này chỉ thêm phần tử '' trong HTML, nó không thay đổi bộ ký tự như được gửi bởi tiêu đề HTTP 'Content-Type'. – Flimm

3

Với các phiên bản gần đây của CGI.pm (Tôi hiện đã cài đặt 3.52), bạn không cần phải xây dựng phần tử <meta> đó theo cách thủ công. Bạn chỉ phải cung cấp bộ ký tự khi bạn gọi phương thức header. Chương trình này:

#!/usr/bin/perl 

use strict; 
use warnings; 
use CGI ":all"; 
use Encode; 

my $cgi = CGI->new; 
binmode STDOUT, ':utf8'; 

print $cgi->header(-type => 'text/html', 
        -charset => 'utf-8'); 

print $cgi->start_html(-title => 'Test'); 
my $text = "\x{201c}test\x{201d}"; # for now 

print $cgi->p($text); 
print $cgi->end_html; 

mang lại cho tôi kết quả này:

Content-Type: text/html; charset=utf-8 

<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> 
<head> 
<title>Test</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<body> 
<p> test </p> 
</body> 
</html> 
+0

Không hoạt động: (Điều đó thực sự xóa ' = "Content-Type" content = "text/html; charset = iso-8859-1" /> ' –

+1

Bạn có phiên bản CGI.pm nào? – cjm

+0

trong' start_html' là '-encoding', không phải' -charset ' –