Encode

这两天在用Perl写一个程序,从一个网页上抽取出某个表格的内容,然后存起来供日后使用。

取网页用LWP::UserAgent,分析表格使用HTML::TableExtract,保存使用Config::General。然而,在用Config::General读取它自己存的文件时出了问题,根源在于编码。网页编码是GB2312,而Perl的内部表示使用Unicode,所以Perl把中文字符看成是一系列奇怪的字节,而Config::General偏偏使用chr(182)作为一个特殊的标志,用来处理Here-Document。当某些中文字符恰好含有这个字节的时候,Config::General就被骗了。

一度,我只好把数据存为CSV格式。

后来在Advanced Perl Programming第二版上看到6.5节Encode后,把网页内容读入后用decode处理一下,在print出去之前再用encode处理一下,就可以了。而Config::General保存的文件本身就是Unicode,所以无需使用Encode来处理。

举个例子

use LWP::UserAgent;
use Encode;

$browser = new LWP::UserAgent;
$response = $browser->get('http://some.where');
$content = decode('euc-cn', $response->content);

这样,一个汉字就会被当成一个字,而不是一系列字节。这里euc-cn就代表gb2312,对于Encode来说它们是同义词,或者说gb2312是euc-cn的alias。

直接打印经过decode的字符串会产生警告,去掉警告的方法是再encode一下,如:

$content = encode('utf8', $content);
print $content, "n";

Emacs 22 on Cygwin

已经有好些日子不能在Cygwin上编译Emacs 22了。昨天更新了一下Cygwin和Emacs,居然就可以编译了,就顺便也更新了用cl编译的Emacs。

Emacs 22指的是当前正在开发的版本,从CVS repository直接check out出来的Emacs就是这个版本。Steve用了很大笔墨介绍replace-regex新功能,即在replacement部分可以插入一段Emacs Lisp代码,这段代码执行的结果和其他字符串一起构成了替换字符串。其中他还提到Emacs 22支持Unicode和UTF-8。

Cygwin上缺省的Emacs版本为21.2,太旧了,所以我通常都会用新编译的Emacs替换掉老的,方法如下:

  1. ./configure --prefix=/usr
  2. make bootstrap
  3. make
  4. make install

由于在Cygwin上编译的Emacs不是特别稳定,偶尔会崩溃,所以通常我会用cl编译一个Windows版的,由于昨天的Emacs 22在nmake bootstrap时有个文件(etc/DOC?)没找到,所以加了-k选项。另外要把cl所在目录放到/usr/bin前面,这样才能使用MSVC的link。方法如下:

  1. cd nt
  2. ./configure.bat
  3. PATH="MSVC/bin/:$PATH" nmake -k bootstrap
  4. PATH="MSVC/bin/:$PATH" nmake
  5. nmake install INSTALL_DIR=c:/emacs

装好之后可以运行C-h n查看NEWS文件,了解一下Emacs 22都增加了哪些新功能,够看好几天了。:-)