首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

URL 編碼 C++ 類別實作:RFC 1738 標準完整支援

     編輯:關於VC++

前言

專案需從 VC6 應用程式 POST 資料,資料必須經 URL 編碼。MSDN 無現成類別/API,故自行設計 CURLEncode 類別,完整支援 RFC 1738 標準。

URL 編碼原理

URL 僅允許 US-ASCII 字元子集 (RFC 1738)。不安全字元需轉為 %XX 格式 (XX 為十六進位 ASCII 碼)。例如空格 (ASCII 32 = 0x20) 編碼為 %20。

不安全字元分類 (ISO-8859-1)

範圍類型安全性
0-31控制字元不安全
32-47保留字元 (空格 ! " # $ % & ' ( ) * + , - . /)不安全
48-57數字 0-9安全
58-64保留字元 (: ; < = > ? @)不安全
65-90大寫 A-Z安全
91-96保留字元 ([ \ ] ^ _ `)不安全
97-122小寫 a-z安全
123-126保留字元 ({ | } ~)不安全
127控制字元不安全
128-255非 ASCII 字元不安全

特殊字元編碼對照表

字元不安全原因編碼
<自由文本中 URL 定界符%3C
>自由文本中 URL 定界符%3E
"某些系統中 URL 定界符%22
#片段/錨點識別符%23
{ } | \ ^ ~ [ ] `閘道/傳輸代理可能修改%7B %7D %7C %5C %5E %7E %5B %5D %60
+表示空格%20
/目錄分隔符%2F
?查詢參數分隔符%3F
&參數分隔符%26

CURLEncode 類別設計

class CURLEncode
{
private:
    static CString csUnsafeString;  // 所有不安全字元集合
    CString decToHex(char num, int radix);  // 十進位轉十六進位字串
    bool isUnsafe(char compareChar);        // 判斷字元是否不安全
    CString convert(char val);              // 單字元編碼: % + 十六進位

public:
    CURLEncode() {}; virtual ~CURLEncode() {};
    CString URLEncode(CString vData);       // 公開介面: 整串編碼
};

核心演算法

bool CURLEncode::isUnsafe(char compareChar)
{
    // 1. 查表 csUnsafeString
    // 2. ASCII 33-122 且不在表中視為安全
    // 3. 其他皆不安全
}

CString CURLEncode::decToHex(char num, int radix)
{
    int n = (unsigned char)num;  // 處理負數 char
    CString hex;
    while (n >= radix) {
        hex = hexVals[n % radix] + hex;
        n /= radix;
    }
    hex = hexVals[n] + hex;
    if (hex.GetLength() < 2) hex = '0' + hex;  // 確保兩位數
    return hex;
}

CString CURLEncode::convert(char val)
{
    CString ret = "%";
    ret += decToHex(val, 16);
    return ret;
}

CString CURLEncode::URLEncode(CString vData)
{
    CString result;
    for (int i=0; i

測試程式

附 MFC 對話框程式 URLEncoder.exe,輸入字串即時顯示編碼結果。

參考標準

  • RFC 1738 / RFC 1866 (HTML 2.0) / HTML 3.2 / HTML 4.0 / W3C 國際化規範

結語

CURLEncode 類別輕量、無依賴、符合標準,可直接整合至任何 VC++ 專案進行 URL 編碼。完整原始碼請下載附件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved