自动识别URI使用的编码(gbk/utf-8)并正确解码

by 清泉 29. 四月 2010 09:40

本文来源:http://www.ialvin.cn/blog/article.asp?id=156

有网友问到 ASP 中 UTF-8 转 GB2312 的问题
使用的是网上流行的 UTF2GB(UTFStr) 函数。
代码甚是复杂,但其实目的是为了实现 JScript 里 decodeURIComponent 功能。
既然 JScript 有 decodeURIComponent,而且 ASP 又可以使用 JScript 为什么现成的内置函数不用呢?如:
<script language="JScript" runat="Server"> 
function decodeURL(s) { return decodeURIComponent(s) }  
</script> 
<%  
Response.Write decodeURL("%E6%8A%9A%E9%A1%BA%E9%9D%92%E6%9D%BE%E8%8D%AF%E4%B8%9A")  
%> 

可能有些朋友就特不喜欢 JScript, 那么利用一下 ADODB.Stream 转码也方便的多
Function UTF2GB(s)     
    Dim sm     
    Set sm = Server.CreateObject("ADODB.Stream")     
    With sm     
        .Type = 2     
        .Mode = 3     
        .Open     
        .CharSet = "iso-8859-1"    
        .WriteText UnEscape(s) ' 使用 unescape 解码成 iso-8859-1 串后 利用 ADODB.Stream 转换编码     
        .Position = 0     
        .CharSet = "UTF-8"    
        UTF2GB = .ReadText(-1)     
        .Close     
    End With    
    Set sm = Nothing    
End Function    
    
Response.Write UTF2GB("%E6%8A%9A%E9%A1%BA%E9%9D%92%E6%9D%BE%E8%8D%AF%E4%B8%9A") 

^_^ 上面说了这么多,都跟主题没什么关系

在原来贴子中,提问的网友最后提到了一个很好的问题。
就是像:
"抚顺青松药业"
GBK 的 URI 编码是 "%B8%A7%CB%B3%C7%E0%CB%C9%D2%A9%D2%B5"
UTF-8 的 URI 编码是 "%E6%8A%9A%E9%A1%BA%E9%9D%92%E6%9D%BE%E8%8D%AF%E4%B8%9A"

在未知何种编码格式的情况下,如何能自动识别其编码,正确解出 "抚顺青松药业" (Google 就能做到)

这个问题之前自己也有被难住过,那时候是做页面统计时,为了分析用户从搜索引擎进入时,用户搜的是什么关键字,这就需要从来路页面的地址中分析出关键字,而 提交给 Google 的搜索关键字有时是 GBK 的 URI 编码,有时是 UTF-8 的 URI 编码。这就要求我们也必须能像 Google 一样能识别出 URI 串是用了什么编码。

在搜索了 UTF-8 的编码规则后,终于写出了下面的代码
Function DecodeURI(ByVal s)     
    s = UnEscape(s)     
    Dim reg, cs     
    cs = "GBK"    
    Set reg = New RegExp     
    reg.Pattern = "^(?:[\x00-\x7f]|[\xfc-\xff][\x80-\xbf]{5}|[\xf8-\xfb][\x80-\xbf]{4}|[\xf0-\xf7][\x80-\xbf]{3}|[\xe0-\xef][\x80-\xbf]{2}|[\xc0-\xdf][\x80-\xbf])+$"    
    If reg.Test(s) Then cs = "UTF-8"    
    Set reg = Nothing    
    Dim sm     
    Set sm = CreateObject("ADODB.Stream")     
    With sm     
        .Type = 2     
        .Mode = 3     
        .Open     
        .CharSet = "iso-8859-1"    
        .WriteText s     
        .Position = 0     
        .CharSet = cs     
        DecodeURI = .ReadText(-1)     
        .Close     
    End With    
    Set sm = Nothing    
End Function    
 
Response.Write DecodeURI("%B8%A7%CB%B3%C7%E0%CB%C9%D2%A9%D2%B5")  
Response.Write DecodeURI("%E6%8A%9A%E9%A1%BA%E9%9D%92%E6%9D%BE%E8%8D%AF%E4%B8%9A") 

偶尔也会有 GBK 编码串被误认为 UTF-8 的,不过,误认的问题并不好解决,Google 都也会出这样的问题。
把代码记下来,备以后用 

Tags:

ASP技术资料

添加评论



(将显示你的Gravatar头像)  

biuquote
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading



Supidea.com 晨飞的梦 @ All Rights Reserved. Powered by BlogYi.NET ver:1.8.0.0. 苏ICP备09011404号

关于博主

kamau
抱着美好的理想背井离乡,这酸甜苦辣只能默默忍受。既然选择了路,就得风雨兼程……

Calendar

<<  五月 2012  >>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

在日历中查看文章

最近的评论

Comment RSS

声明

      本博所发一切破解相关附件只作学习研究交流之用,严禁用于商业用途,请在下载24小时内删除。
      本博所有网友评论不代表本博立场,版权归其作者所有。

© Copyright 2009