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 都也会出这样的问题。
把代码记下来,备以后用