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

新手入门、经验交流

Moderator: cre

Forum rules
  • 软件自带帮助是最好的入门教程,请仔细阅读;在您掌握最基本知识前,我们没法帮助您
  • 提问前请先查阅软件帮助文件和论坛相关讨论
  • 查阅软件帮助和论坛相关讨论即可解决的问题帖将直接删除,以免浪费他人时间
  • 请学会如何提问,尽量将问题描述清楚,不明确的提问将被直接删除
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

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

Post by phoenix »

原理

中文网页的编码方式主要有2种,GB2312和UTF-8。在GB2312方式中,一个汉字占用2个字节,而UTF-8方式中,一个汉字占用3个字节。如下图,当我们将“一”这个汉字分别用GB2312和UTF-8方式储存的时候,以16进制方式来看,它们的内容是不一样的。
encoding.png
encoding.png (35.81 KiB) Viewed 27955 times
在Proxomitron的配置文件中,一个汉字也是占用2个字节,所以我们可以直接过滤GB2312编码网页中的中文;另一方面,我们不能用2个字节去匹配3个字节,所以不能直接过滤UTF-8编码网页中的中文。

匹配

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

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

Code: Select all

[%e4][%b8][%80]
替换

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

附件里我提供了一个工具,可以将UTF-8字符转换为character entity格式。

实例

以www.google.cn为例,以其中的“高级搜索”字符串为目标。
before.png
before.png (21.87 KiB) Viewed 27951 times
通过16进制工具,我们可以看到其16进制内容为:
sample.png
sample.png (18.54 KiB) Viewed 27953 times
相应的,匹配表达式应该写为:

Code: Select all

[%E9][%AB][%98][%E7][%BA][%A7][%E6][%90][%9C][%E7][%B4][%A2]
本例中,我打算将其替换为“不做恶”,通过附件中的工具,得到其character entity格式为:

Code: Select all

不做恶
最终的规则如下:

Code: Select all

[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 = "不做恶"
过滤效果如下:
after.png
after.png (21.49 KiB) Viewed 27965 times
Attachments
utf8.zip
(520 Bytes) Downloaded 1317 times
vvmao
Posts: 34
Joined: Oct 04 2008, 16:59

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

Post by vvmao »

厉害,佩服。
我也往这方面想过,但是没做到这一步。可是这样似乎还是不能支持blockfile
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

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

Post by phoenix »

blockfile不支持[%xx],只能在规则里直接用。
天堂之门
Posts: 17
Joined: Nov 27 2008, 10:50

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

Post by 天堂之门 »

:idea:

应该再明确写出来,让中文用户注意:

网页源代码中如果有中文字符,那么在规则编辑框的 test 窗口内,按 Profile 按钮得到的 Sample Text: ??? bytes 这个字节数结果是错误的!

因为正如 Phoenix 所说,是把一般为 3 个字节的 UTF-8 编码当作了 2 个字节的 GB2312 编码来对待……
所以必须数一下要匹配测试的内容中有多少个中文字符,然后把这个数过的量加到字节数里才是正确的……
Ray4
Moderator
Posts: 65
Joined: Dec 30 2007, 09:37

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

Post by Ray4 »

这里有个工具,可能将中文字符直接转换为[%xx]的形式,可以自动将转换后的形式添加到指定文件
http://site.halfmoon.jp/movielist/96.html
Attachments
proxstrenc_0_1_5_0.zip
(97.18 KiB) Downloaded 1190 times
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

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

Post by phoenix »

那个网页版就够用了,能将UTF-8编码按匹配替换格式进行转换。
http://pseweb.half-moon.org/
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

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

Post by phoenix »

初学python,做了个在线转换工具练手,欢迎大家测试。
http://www.proxomitron.cn/tools/prox_utf-8.py
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

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

Post by ddbb »

求编码指定.......

我PROX规则里要同时写入对应中文和日文编码的 所以UTF-8只是基本要求 还有GB2312 SHIFT_JIS

就像 http://pseweb.half-moon.org/ 这个这样的..........

就是那个太慢了.....打开要等半天........如果你也有编码指定了.......我就用你的了..........
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

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

Post by phoenix »

GB2312编码在网页和Proxomitron的配置文件中,都是以2个字节为一个单位,可以直接过滤啊。

SHIFT_JIS我不清楚。你抓个16进制的图我看看?
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

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

Post by ddbb »

这个2字节的字符是要保存到 *.ptron 文件里的.....

我现在用的是sidki_2009-05-24.ptron 西文 在里面是不能保存双字节中文的.....再加上我还要存日文......所以转成这种全字母的才能用........

16进制??? 我这没有相应的工具......不过你可以在你发出来的http://pseweb.half-moon.org/ 试试....

他那个页面默认不是有UTF-8 EUC-JP 好像他那个代码写的 只要写入任何一个正确的编码名都能转的.....我就写了个FILTER 加入了gb2312 也能正常的转........
Post Reply