http://www.yuzhe.name/Item.asp?id=109
在浏览器中打开一个网址,如果网址中含中文字符时浏览器会自动根据当前页面的编码进行对就的编码。我们大家最常见到的就是用google和百度进行搜索时,中文关键字就是以编码后的形式显示在浏览器的地址栏里面。
最近在做一个程序时,要用到获取搜索引擎的关键字功能。在网上找了很多关键这样的函数代码,然后均不是通用的,要么只能在gb2312编码的页面中得到对应的url为gb2312编码的结果,要么就是只能在utf-8的页面中得到url编码为utf-8的解码。但目前主流搜索引擎Google和百度的编码却不一样。
Google采用了utf-8国际编码,而百度却用的是gb2312编码。比如我们在google和百度搜索“雨哲”,编码后的url路径为:
~~~
Google:http://www.google.cn/search?q=%E9%9B%A8%E5%93%B2
百度:http://www.baidu.com/s?wd=%D3%EA%D5%DC
~~~
也就是说:
~~~
“雨哲”的UTF-8编码为:%E9%9B%A8%E5%93%B2
“雨哲”的GB2312编码为:%D3%EA%D5%DC
~~~
网上有很多url编码解码的函数,但均只能在单一页面对对应的编码进行解码,我这篇文章说的重点就在这里:如何在一种编码的页面中能通时对中文进行两种编码的编码,而且也能同时对两种编码进行对就的解码。(注:以下所说的代码如未作特别说明,均指在utf-8页面环境中使用)
一、Url编码通用代码:
~~~
'==================================================
'函 数 名: YuZhe_UrlEncode
'功 能: 将指定字符进行指定格式进行编码
'参 数: iStrCode 目标字符
' iPageCode 指定编码 65001-UTF-8或936-GB2312
'==================================================
Function YuZhe_UrlEncode(iStrCode, iPageCode)
Dim StrUrlEncode
StrUrlEncode = "" '初始化变量
If iPageCode <> SetPageCode Then '如果指定要编码的类型与当前页面编码不一至,则临时设置处理该函数时的页面编码类型
Session.CodePage = iPageCode
StrUrlEncode = Server.UrlEncode(iStrCode)
Session.CodePage = SetPageCode '还原页面编码为默认
Else
StrUrlEncode = Server.UrlEncode(iStrCode)
End If
YuZhe_UrlEncode = StrUrlEncode
End Function
~~~
示例:
~~~
<%
Const SetPageCode = "UTF-8" '定义当前文件编码类型
Response.Write "输出UTF-8编码" & YuZhe_UrlEncode("雨哲", 65001)
Response.Write "输出GB2312编码" & YuZhe_UrlEncode("雨哲", 936)
%>
~~~
二、URl解码函数:
1.UTF-8解码函数:
~~~
'==================================================
'函数名: UTF2GB
'功能: 将utf-8编码解码为中文
'UTFStr: 需要编码的字符,在utf-8和gb2312两种页面编码中均可使用
'==================================================
function UTF2GB(UTFStr)
Dim dig,GBSTR
for Dig=1 to len(UTFStr)
if mid(UTFStr,Dig,1)="%" then
if len(UTFStr) >= Dig+8 then
GBStr=GBStr & ConvChinese(mid(UTFStr,Dig,9))
Dig=Dig+8
else
GBStr=GBStr & mid(UTFStr,Dig,1)
end if
else
GBStr=GBStr & mid(UTFStr,Dig,1)
end if
next
UTF2GB=GBStr
end function
function ConvChinese(x)
dim a,i,j,DigS,Unicode
A=split(mid(x,2),"%")
i=0
j=0
for i=0 to ubound(A)
A(i)=c16to2(A(i))
next
for i=0 to ubound(A)-1
DigS=instr(A(i),"0")
Unicode=""
for j=1 to DigS-1
if j=1 then
A(i)=right(A(i),len(A(i))-DigS)
Unicode=Unicode & A(i)
else
i=i+1
A(i)=right(A(i),len(A(i))-2)
Unicode=Unicode & A(i)
end if
next
if len(c2to16(Unicode))=4 then
ConvChinese=ConvChinese & chrw(int("&H" & c2to16(Unicode)))
else
ConvChinese=ConvChinese & chr(int("&H" & c2to16(Unicode)))
end if
next
end function
function c16to2(x)
'这个函数是用来转换16进制到2进制的,可以是任何长度的,一般转换UTF-8的时候是两个长度,比如A9
'比如:输入“C2”,转化成“11000010”,其中1100是"c"是10进制的12(1100),那么2(10)不足4位要补齐成(0010)。
dim tempstr
dim i:i=0'临时的指针
for i=1 to len(trim(x))
tempstr= c10to2(cint(int("&h" & mid(x,i,1))))
do while len(tempstr)<4
tempstr="0" & tempstr'如果不足4位那么补齐4位数
loop
c16to2=c16to2 & tempstr
next
end function
function c2to16(x)
'2进制到16进制的转换,每4个0或1转换成一个16进制字母,输入长度当然不可能不是4的倍数了
dim i:i=1'临时的指针
for i=1 to len(x) step 4
c2to16=c2to16 & hex(c2to10(mid(x,i,4)))
next
end function
function c2to10(x)
'单纯的2进制到10进制的转换,不考虑转16进制所需要的4位前零补齐。
'因为这个函数很有用!以后也会用到,做过通讯和硬件的人应该知道。
'这里用字符串代表二进制
c2to10=0
if x="0" then exit function'如果是0的话直接得0就完事
dim i:i=0'临时的指针
for i= 0 to len(x) -1'否则利用8421码计算,这个从我最开始学计算机的时候就会,好怀念当初教我们的谢道建老先生啊!
if mid(x,len(x)-i,1)="1" then c2to10=c2to10+2^(i)
next
end function
function c10to2(x)
'10进制到2进制的转换
dim sign, result
result = ""
'符号
sign = sgn(x)
x = abs(x)
if x = 0 then
c10to2 = 0
exit function
end if
do until x = "0"
result = result & (x mod 2)
x = x \ 2
loop
result = strReverse(result)
if sign = -1 then
c10to2 = "-" & result
else
c10to2 = result
end if
end function
'雨哲注:本函数代码来自网络
~~~
示例:
~~~
<%
Response.Write "解码%E9%9B%A8%E5%93%B2" & UTF2GB("%E9%9B%A8%E5%93%B2")
%>
~~~
2.GB2312解码函数:
~~~
'==================================================
'函数名: Gb2312UrlDecode
'功能: 将Gb2312Url编码解码为中文
'EncodeStr: 需要解码的GB2312编码,仅在GB2312页面编码中有效
'==================================================
Function Gb2312UrlDecode(DecodeStr)
'On Error Resume Next
If DecodeStr = "" Or IsNull(DecodeStr) Then Exit Function
Dim NewGb2312UrlDecodeStr,HaveGb2312UrlDecodeChar,LastGb2312UrlDecodeChar
Dim iGb2312UrlDecode,Gb2312UrlDecodeChar_C,Gb2312UrlDecodeChar_C_1,Gb2312UrlDecodeChar_Num_1
NewGb2312UrlDecodeStr = ""
HaveGb2312UrlDecodeChar = False
LastGb2312UrlDecodeChar = ""
For iGb2312UrlDecode = 1 To Len(DecodeStr)
Gb2312UrlDecodeChar_C = mid(DecodeStr,iGb2312UrlDecode,1)
If Gb2312UrlDecodeChar_C = "+" Then
NewGb2312UrlDecodeStr = NewGb2312UrlDecodeStr & " "
ElseIf Gb2312UrlDecodeChar_C = "%" Then
Gb2312UrlDecodeChar_C_1 = Mid(DecodeStr,iGb2312UrlDecode+1,2)
Gb2312UrlDecodeChar_Num_1 = Cint("&H" & Gb2312UrlDecodeChar_C_1)
If HaveGb2312UrlDecodeChar Then
HaveGb2312UrlDecodeChar = False
NewGb2312UrlDecodeStr = NewGb2312UrlDecodeStr & Chr(Cint("&H" & LastGb2312UrlDecodeChar & Gb2312UrlDecodeChar_C_1))
Else
If abs(Gb2312UrlDecodeChar_Num_1) <= 127 then
NewGb2312UrlDecodeStr = NewGb231
HaveGb2312UrlDecodeChar = True
LastGb2312UrlDecodeChar = Gb2312UrlDecodeChar_C_1
End If
End if
iGb2312UrlDecode = iGb2312UrlDecode+2
Else
NewGb2312UrlDecodeStr = NewGb2312UrlDecodeStr & Gb2312UrlDecodeChar_C
End If
Next
Gb2312UrlDecode = NewGb2312UrlDecodeStr
End Function
~~~
示例:
~~~
<%
Const SetPageCode = "65001" '定义当前文件编码类型
If SetPageCode <> 936 Then
Session.CodePage = 936
Response.Write "%D3%EA%D5%DC解码结果" & Gb2312UrlDecode("%D3%EA%D5%DC")
Session.CodePage = SetPageCode
Else
Response.Write "%D3%EA%D5%DC解码结果" & Gb2312UrlDecode("%D3%EA%D5%DC")
End If
%>
~~~
版权申明:转载请注明来源“雨哲在线”。本信息与以上内容是不可分割的。
- 前端工程师
- HTML
- 使用meta实现页面的定时刷新或跳转
- 表单相关
- 表单元素input、按钮、文字完美垂直居中对齐方法
- CSS
- 相关工具网站
- JS
- jQuery
- 第1章 初始jQuery
- 环境搭建
- jQuery对象与DOM对象
- jQuery对象转化成DOM对象
- DOM对象转化成jQuery对象
- 第2章 jQuery选择器
- id选择器
- 类选择器
- 元素选择器
- 全选择器(*选择器)
- 层级选择器
- 基本筛选选择器
- 内容筛选选择器
- 可见性筛选选择器
- 属性筛选选择器
- 子元素筛选选择器
- 表单元素选择器
- 表单对象属性筛选选择器
- 特殊选择器this
- 第3章 jQuery的属性与样式
- 元素的数据存储
- 问题解决方案
- 解决innerHTML包含的js代码不能被执行的问题
- webpackdoc
- 前端开发框架
- Bootstrap 3.3.6
- 起步
- 全局 CSS 样式
- 概览
- 栅格系统
- PHP
- PHP入门篇
- 基础总结
- PHP环境变量$_SERVER和系统常量详细说明
- PHP进阶篇
- 数组
- 函数
- 类
- 字符串操作
- 正则表达式
- 会话控制
- 文件系统
- 日期和时间
- 图形图像操作
- PHP异常处理
- 数据库操作
- WEB在线文件管理器
- PHP文件操作
- 获取首层目录信息
- 获取文件信息
- 列表显示文件及大小
- PHP与MySQL关系大揭秘
- PHP支持哪些数据库
- 数据库扩展
- 连接MySQL数据库
- 执行MySQL查询
- 插入新数据到MySQL中
- MVC架构模式分析与设计
- Smarty模版语法
- Smarty的基本语法
- Smarty的条件判断语句
- Smarty的循环语句
- Smarty的文件引用
- Smarty类和对象赋值与使用
- Smarty函数的使用
- functions函数插件的定义和使用
- modifiers变量调节器插件的定义和使用
- block functions区块函数插件的定义和使用
- Smarty实例
- MVC微型框架的建立
- 网络摘抄
- PHPExcel如何读取超大excel文件
- Composer
- Composer技巧
- PHP 开发者该知道的 5 个 Composer 小技巧
- composer常用命令
- Composer使用方法整理(Cy23)
- 利用Composer一步一步搭建自己的PHP框架
- ThinkPHP
- ThinkPHP中RBAC类详解(一)
- 附:添加注释版RBAC类源码
- 常见问题
- 常见方法
- thinkphp 合并两个字段组合成一个临时字段concat函数
- ThinkPHP Where 条件中使用表达式
- 编程相关工具
- Eclipse
- Eclipse或Zendstudio汉化
- Zend studio
- Zendstudio快捷键
- Zend Studio实用快捷键一览表
- Sublime text
- Sublime text快捷键
- 16 个 Sublime Text 快捷键
- Emmet的用法及相关语法
- VS Code
- 数据库
- MySql
- 问题汇总
- mysql创建存储过程失败1307错误解决
- Mysql出现Field * doesn't have a default value解决办法
- mysql:ADO连接mysql数据库,驱动程序和ODBC数据源问题
- 自己如何正确获取MYSQL的ADO连接字符串
- 网上摘抄
- mysql 存在更新 不存在插入
- Mysql字符串字段中是否包含某个字符串,用 find_in_set
- mysql字段类型对应的数字编号
- 5.7mysql group分组查询错误问题
- mysql常用操作语句
- SQL2005
- SQL常见错误
- 使用 sp_change_users_login 修复产生的孤 立账户 & 还原中的孤立用户
- ASP
- Url编码解码函数合集 含utf-8和gb2312
- 其他前端相关技巧
- 联机查看 Office 文档
- 服务器配置
- windows
- 服务器安装
- XAMPP自带TOMCAT插件可以支持php+java
- IIS
- iis7服务器,客户端无法下载exe文件的解决之道
- Linux
- ubuntu
- Linux安装JDK
- 辅助开发工具
- Git