專案需從 VC6 應用程式 POST 資料,資料必須經 URL 編碼。MSDN 無現成類別/API,故自行設計 CURLEncode 類別,完整支援 RFC 1738 標準。
URL 僅允許 US-ASCII 字元子集 (RFC 1738)。不安全字元需轉為 %XX 格式 (XX 為十六進位 ASCII 碼)。例如空格 (ASCII 32 = 0x20) 編碼為 %20。
| 範圍 | 類型 | 安全性 |
|---|---|---|
| 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 |
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,輸入字串即時顯示編碼結果。
CURLEncode 類別輕量、無依賴、符合標準,可直接整合至任何 VC++ 專案進行 URL 編碼。完整原始碼請下載附件。