本文對encode、decode、urlencode和urldecode幾個概念的含義進行對比分析。
encoding和decoding
在計算機科學中,encoding指把一個字符序列,按照某種特定的規則,轉換為一種特定的格式。decoding的含義反之。
在文本處理的編碼轉換中,encoding指把字符流按照某種編碼轉換為字節流,decoding指把字節流根據其編碼還原為字符流。
一些編程語言中,內置了相應的函數調用。
如在python中,內部的字符串編碼是unicode。當讀取一個UTF-8編碼的文件內容后,實際保存的是字節流。如果要轉換為字符流,需要調用decoding函數進行解碼。如下例子所示:
file = open(file_path) line = file.readline() line = line.decode("UTF-8")
這段代碼執行后,line的內容是 以unicode格式保存的字符串。
再看一下Perl。Perl 5.6之后內部字符串以UTF-8方式存在。上述的邏輯,用Perl實現是這樣的:
open INPUT $file_path my $line = <INPUT> $line = decode("utf8", $line)
這里需要使用use Encode引入Encode包。如果在讀取文件時已經指定了編碼,那么就不需要再單獨做decode解碼了。如下所示,
open INPUT ”<:utf8" $file_path
my $line = <INPUT>
對於非IO讀入,而在代碼中硬編碼的字符串,可以理解為字節流,其編碼與文件編碼一致。
在進行字符串操作前,建議統一采用decode解碼,這樣可以保證內部處理的一致性和正確性。
在python或者Perl中,如果要把字符串輸出,最好不要直接輸出,而是先編碼為字節流再輸出。否則,有可能報錯。
如在python中輸出某一行到屏幕,
line = line.encode("UTF8")
print line
urlencode和urldecode
urlencode對URL進行編碼。URL是一個字符串,urlencode把它理解為一個字節流,直接對每個字節進行轉換,轉換規則是把每個字節轉換為%HH的形式,HH等於字節的ASCII碼值。如果URL中包含了中文參數,根據中文參數編碼的區別,會決定urlecode的結果有所不同。
urldecode是把經過urlencode編碼后得到的字符串還原為原始狀態,根據urlencode的規則可知,urldecode的輸入字符都在ASCII編碼的范圍內。
在python中,提供了urlencode包。
下面是一段實際的代碼:
from urllib import urlencode
url = "http://www.google.com/search?" + "%s"
key = "字符串";
mass = {}
mass["key"] = key
params = urlencode(mass)
encode_url = url % params
這一段程序源碼的編碼是UTF-8,encode_url即為encode之后的url:
http://www.google.com/search?key=%E5%AD%97%E7%AC%A6%E4%B8%B2
用Perl語言的話,通過調用unpack函數實現。
my $url = "http://www.google.com/search?key=";
my $query = "字符串";
$query =~ s/(\W)/sprintf("%%%02x", unpack("C", $1))/eg;
my $encode_url = $url . $query;
Author: shiqi.cui <cuberub@gmail.com>
Date: 2009-05-17