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