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

posted on 2012-04-02 00:56  cuberub  阅读(4223)  评论(0编辑  收藏  举报

导航