UTF-8编码网页中中文的处理方法

Posted on 2010年3月3日 15:40

原理

中文网页的编码方式主要有2种,GB2312和UTF-8。在GB2312方式中,一个汉字占用2个字节,而UTF-8方式中,一个汉字占用3个字节。如下图,当我们将“一”这个汉字分别用GB2312和UTF-8方式储存的时候,以16进制方式来看,它们的内容是不一样的。

utf-8 encoding

在Proxomitron的配置文件中,一个汉字也是占用2个字节,所以我们可以直接过滤GB2312编码网页中的中文;另一方面,我们不能用2个字节去匹配3个字节,所以不能直接过滤UTF-8编码网页中的中文。

匹配

尽管Proxomitron的帮助文件没有提到,但它实际上提供了以16进制方式按字节匹配的能力,符号为[%xx]。

以上图为例,如果要匹配UTF-8编码的“一”字,表达式为:

[%e4][%b8][%80]

替换

显然,我们无法通过Proxomitron在UTF-8编码的网页中插入以3个字节为存储单位的汉字,但我们可以通过character entity的方式来达到我们的目的。关于character entity的知识,请自行google。

实例

以www.google.cn为例,以其中的“高级搜索”字符串为目标。

utf-8 before

通过16进制工具,我们可以看到其16进制内容为:

utf-8 hex

相应的,匹配表达式应该写为:

[%E9][%AB][%98][%E7][%BA][%A7][%E6][%90][%9C][%E7][%B4][%A2]

本例中,我打算将其替换为“不做恶”,其character entity格式为:

不做恶

最终的规则如下:

[Patterns]
Name = "utf-8 demo"
Active = TRUE
URL = "$TYPE(htm)www.google.cn/"
Limit = 20
Match = "[%E9][%AB][%98][%E7][%BA][%A7][%E6][%90][%9C][%E7][%B4][%A2]"
Replace = "不做恶"

过滤效果如下:

utf-8 after

在线转换工具

我写了一个小工具,可以方便地将UTF-8字符串转换成Proxomitron的Match和Replace格式。

链接: 相关讨论