« 上一篇下一篇 »

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

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

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

Leave a Comment

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。