2015-11-20 46 views
0

我一直在破壞我的腦袋,試圖弄清楚如何處理一些特殊的共性是通過表格的用戶輸入。我的意思的例子是版權標誌,註冊標誌,分數1/2,1/4的分數,等等。因此,這裏發生了什麼:特殊字符多餘的字符顯示出來之前

用戶輸入這些字符,並將它們保存到一個普通的文本文件。沒問題。他們被保存在他們的真實和純粹的形式。現在,當我們用Perl CGI文件抓取它們並將它們顯示在瀏覽器中時,我得到了所有這些「A」和其他A字符以及上面的標記。我在字符串上運行一個子例程,試圖將這些從Unicode匹配轉換爲HTML實體,但它似乎沒有工作。

Perl代碼:

#string with special characters 
$special_chars=encodebc($special_chars); 

sub encodebc{ 
$answer=$_[0]; 
$answer =~ s/:://gi; 
$answer =~ s/\x{0022}/"/g; 
$answer =~ s/\x{0027}/'/g; 
$answer =~ s/\x{0026}/&/g; 
$answer =~ s/\x{003C}/</g; 
$answer =~ s/\x{003E}/>/g; 
$answer =~ s/\x{0060}/`/g; 
$answer =~ s/\x{007B}/{/g; 
$answer =~ s/\x{007D}/}/g; 
$answer =~ s/\x{00A9}/©/g; 
$answer =~ s/\x{00AE}/®/g; 
$answer =~ s/\x{00AB}/«/g; 
$answer =~ s/\x{00BB}/»/g; 
$answer =~ s/\x{00A2}/¢/g; 
$answer =~ s/\x{00B0}/°/g; 
$answer =~ s/\x{00B2}/²/g; 
$answer =~ s/\x{00B3}/³/g; 
$answer =~ s/\x{00B5}/µ/g; 
$answer =~ s/\x{00BC}/¼/g; 
$answer =~ s/\x{00BD}/½/g; 
$answer =~ s/\x{00BE}/¾/g; 
$answer =~ s/\x{00E1}/á/g; 
$answer =~ s/\x{00E9}/é/g; 
$answer =~ s/\x{00F1}/ñ/g; 
$answer =~ s/\x{00F5}/õ/g; 
$answer =~ s/\x{00F8}/ø/g; 
return $answer; 
} 

在上面的代碼,我匹配在Unicode雙字節字符...所以我不理解,其中「A」字的來源。

之前,你downvote我,請知道我花了幾個小時後小時的工作就這個問題和閱讀試圖弄清楚這一點。我很感激能夠幫助我的人。

+1

*非常*很長的關於在Perl中處理Unicode的答案在這裏:http://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default – roeland

+1

但總之:「他們的真實和純粹的形式「並不意味着什麼。它必須使用像UTF-8或UTF-16這樣的編碼進行存儲。如果你的文本看起來像''¢¢'''那麼你可能會發送UTF-8,但是在HTTP標頭中聲明它爲ISO-8859-1。 – roeland

+0

它的外觀。在Perl中關於Unicode的文章鏈接的讚譽!我的頭正在游泳! – Bob

回答

0

更改HTTP頭-charset=>'utf-8',現在它完美的作品。