perl encode,decode
原文:http://www.cnblogs.com/slaughter/archive/2007/03/15/675791.html
Perl從5.6開始已經開始在內部使用utf8編碼來表示字元,也就是說對中文以及其他語言字元的處理應該是完全沒有問題的。我們只需要利用好 Encode這個模組便能充分發揮Perl的utf8字元的優勢了。
下面就以中文文字的處理為例進行說明,比如有一個字串"測試文字",我們想要把這個中文字串拆成單個字元,可以這樣寫:
use Encode;
$dat="測試文字";
$str=decode("gb2312",$dat);
@chars=split //,$str;
foreach $char (@chars) {
print encode("gb2312",$char),"\n";
}
結果大家試一試就知道了,應該是令人滿意的。
這裡主要用到了Encode模組的decode、encode函式。要了解這兩個函式的作用我們需要清楚幾個概念:
1、Perl字串是使用utf8編碼的,它由Unicode字元組成而不是單個位元組,每個utf8編碼的Unicode 字元佔1~4個位元組(變長)。
2、進入或離開Perl處理環境(比如輸出到螢幕、讀入和儲存檔案等等)時不是直接使用Perl字串,而需要把Perl字串轉換成位元組流,轉換過程中使用何種編碼方式完全取決於你(或者由Perl代勞)。一旦Perl字串向位元組流的編碼完成,字元的概念就不存在了,變成了純粹的位元組組合,如何解釋這些組合則是你自己的工作。
我們可以看出如果想要Perl按照我們的字元概念來對待文字,文字資料就需要一直用Perl字串的形式存放。但是我們平時寫出的每個字元一般都被作為純ASCII字元儲存(包括在程式中明文寫出的字串),也就是位元組流的形式,這裡就需要encode和decode函式的幫助了。
encode函式顧名思義是用來編碼Perl字串的。它將Perl字串中的字元用指定的編碼格式編碼,最終轉化為位元組流的形式,因此和 Perl處理環境之外的事物打交道經常需要它。其格式很簡單:
$octets = encode(ENCODING, $string [, CHECK])
$string: Perl字串
encoding: 是給定的編碼方式
$octets: 是編碼之後的位元組流
check: 表示轉換時如何處理畸變字元(也就是Perl認不出來的字元)。一般不需使用
編碼方式視語言環境的不同有很大變化,預設可以識別utf8、ascii、ascii-ctrl、
iso-8859-1等。
decode函式則是用來解碼位元組流的。它按照你給出的編碼格式解釋給定的位元組流,將其轉化為使用utf8編碼的Perl字串,一般來說從終端或者檔案取得的文字資料都應該用decode轉換為Perl字串的形式。它的格式為:
$string = decode(ENCODING, $octets [, CHECK])
$string、 ENCODING、$octets和CHECK的含義同上。
現在就很容易理解上面寫的那段程式了。因為字串是用明文寫出的,存放的時候已經是位元組流形式,喪失了本來的意義,所以首先就要用 decode函式將其轉換為Perl字串,由於漢字一般都用gb2312格式編碼,這裡decode也要使用gb2312編碼格式。轉換完成後Perl 對待字元的行為就和我們一樣了,平時對字串進行操作的函式基本上都能正確對字元進行處理,除了那些本來就把字串當成一堆位元組的函式(如vec、 pack、unpack等)。於是split就能把字串切成單個字元了。最後由於在輸出的時候不能直接使用utf8編碼的字串,還需要將切割後的字元用encode函式編碼為gb2312格式的位元組流,再用print輸出。
相關文章
- Encode and Decode Strings
- python encode和decode的妙用Python
- LeetCode-Encode and Decode StringsLeetCode
- EXT中decode()和encode()方法(轉載)
- python編碼問題之”encode”&”decode”Python
- python中encode和decode函式說明Python函式
- python str與byte轉換 encode decodePython
- 字串的encode與decode解決亂碼問題字串
- Python——UnicodeEncodeError: 'ascii' codec can't encode/decode charactersPythonUnicodeErrorASCII
- 簡單加密/解密方法包裝, 含encode(),decode(),md5() (轉)加密解密
- PHPjson_encode/json_decode與serialize/unserializ效能測試PHPJSON
- PHP中json_decode()和json_encode()的使用方法PHPJSON
- url編碼和解碼分析URLEncoder.encode和URLDecoder.decode
- php中利用json_encode和json_decode傳遞包括特殊字元的資料PHPJSON字元
- JSON到物件的轉換(反序列化)方法,EXT.decode()和EXT.encode()方法(轉帖)JSON物件
- 7.76 DECODE
- perl
- golang url decodeGolang
- decode函式函式
- decode的使用
- hackmyvm--Decode
- iOS 使用 NSCharacterSet encode URLiOS
- perl Statistics::Descriptive Perl 的統計模組
- 代替DECODE的CASE
- perl教程
- Perl語言學習(四)Perl控制結構
- 《Modern Perl》前言--包含了Perl的安裝使用
- perl-Time-HiRes安裝與perl衝突
- perl指令碼指令碼
- perl 特殊字元字元
- perl dbi oracleOracle
- perl 基礎
- perl DBD::oracleOracle
- perl 安裝
- php json_encode 細節PHPJSON
- json_decode詳解JSON
- Leetcode-Decode WaysLeetCode
- Decode Ways leetcode javaLeetCodeJava