encode, decode, urlencode和urldecode辨析
本文对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