[转载]encode,decode,urlencode和urldecode辨析

[转载]encode, decode, urlencode和urldecode辨析 – cuberub – 博客园.

  本文对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

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏