今天在測試lwp模組的時候,發現讀取的**內容含有中文的輸出後都是亂碼,於是學習了一下perl的encode模組,寫一下總結,做個備忘,也希望能對其他的朋友有幫助!
先來學習一下perl中編碼的基礎知識:在perl看來, 字串只有兩種形式。一種是octets, 即8位序列, 也就是我們通常說的位元組陣列。另一種utf8編碼的字串, perl管它叫string。
也就是說: perl只認識兩種編碼: ascii(octets)和utf8(string)。
那麼perl如何確定乙個字串是octets還是utf8編碼的字串呢?
perl可沒有什麼智慧型, 他完全是靠字串上的utf8
flag. 在perl內部, 字串結構由兩部分組成: 資料和utf8 flag.如果utf8
flag是on的話, perl就會把它當成utf8字串來處理, 如果utf8
flag為off, perl就會把它當成octets來處理. 所有字串相關的函式包括正規表示式都會受utf8 flag的影響.
那麼確定乙個字串的utf8 flag是否已開啟? 使用encode::is_utf8($str). 這個函式並不是用來檢測乙個字串是不是utf8編碼, 而是僅僅看看它的utf8
flag是否開啟.
一、
字串讀入亂碼
讀入的內容亂碼有兩種情形:
1.字串本來不是utf8編碼的, 應該先把它轉成utf8編碼, 並且使它的utf8 flag處於開啟狀態. 比如下面將gbk轉換成utf8編碼。
點選(此處)摺疊或開啟
my $out=decode("gbk",$str);
這裡拿我們lwp為例子,原來baidu.com的編碼為gbk,轉換成utf8後就不亂碼了。**如下:
點選(此處)摺疊或開啟
my $url='';
my $content=get $url;
die "couldn't get $url" unless defined $content;
my $out=decode("gbk",$content);
print $out,"\n";
2.字串編碼本來就是utf8,
只是utf8 flag沒有開啟, 那麼你可以使用以下方式中的任一種來開啟utf8 flag
點選(此處)摺疊或開啟
$str = encode::decode_utf8($str);
$str = encode::decode("utf8", $str);
二、
字串輸出亂碼
字串在程式內被正確地處理後, 要展現給使用者. 這時我們需要把字串從perl internal form轉化成使用者能接受的形式. 簡單地說, 就是把字串從utf8編碼轉換成輸出的編碼或表現介面的編碼. 這時候, 我們使用如下**來將utf8的編碼轉換成其他的編碼:
點選(此處)摺疊或開啟
$str = encode::encode('charset', $str);
參考:
關於中文亂碼解決
在開發中我遇到的情況是,action獲取頁面的引數中文是亂碼,將1,2兩種方法都試了,但是還是不行,最後用第三種方法解決了,就是在server.xml配置檔案中設計置 如下第3點uriencoding utf 8 希望對大家有幫助 關於中文亂碼解決辦法有幾種 1.在頁面設定編碼方式 utf 8 設定...
JQuery AJAX提交中文亂碼的解決辦法
jquery是乙個非常優秀的框架,在特定場合下使用jquery提交資料,相當的方便快捷。但是,在處理乙個gb2312編碼的 ajax提交時,中文資料卻成了亂碼。現象如下 1 在firefox下,處理頁面的編碼為gb2312,提交資料沒有問題,中文能夠正確解析 2 在ie8下,處理頁面的編碼為gb23...
sublime text2 中文亂碼的解決辦法
1.安裝sublime package control 在sublime text 2上用ctrl 開啟控制台並在裡面輸入以下 sublime text 2就會自動安裝package control。import urllib2,os pf package control.sublime packa...