WAP (Wireless Application Protocol) 是早期移動互聯網標準協議棧,針對低帶寬、高延遲、小屏幕設備設計。雖然智能機時代已被 HTML5 取代,但其網關轉碼、標記語言嚴格性、資源受限適配等設計思想對物聯網、輕量級客戶端開發仍有參考價值。
WAP 手機 (微瀏覽器)
↓ HTTP/WSP
WAP 網關 (編碼壓縮、協議轉換 WAP↔HTTP)
↓ HTTP
WAP 應用服務器 (PHP 腳本動態生成 WML)
↓ WML
WAP 網關 (二進制編碼 WBXML)
↓
WAP 手機渲染顯示
header("Content-type: text/vnd.wap.wml"); // 必須在任何輸出前發送
echo '';
echo '';
echo '';
echo 'Hello WAP
';
echo ' ';
常見錯誤:忘記發送 Header、輸出前有空白字符、編碼聲明與實際不符。
<p>...</p>, <br/>width="100%"& < > " 'wml > card > (p | do | img | ...)WBMP (Wireless Bitmap) 是 1-bit 黑白位圖格式,極其精簡。
header("Content-type: image/vnd.wap.wbmp");
$im = imagecreate(50, 50); // 創建調色板圖像
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
imagerectangle($im, 5, 5, 20, 20, $black); // 繪製矩形框
imagewbmp($im); // 輸出 WBMP
imagedestroy($im); // 釋放資源
應用場景:動態生成股票 K 線圖、驗證碼、簡單圖表。需啟用 GD 擴展 (php_gd.dll)。
| 層面 | WAP 標準 | 中文習慣 |
|---|---|---|
| 字符集 | Unicode 2.0 (UCS-2/UTF-8/UTF-16) | GB2312 / GBK / Big5 |
| 終端支援 | 早期 Nokia 7110, Ericsson R320s 僅支援 UTF-8 | 國產手機/模擬器常支援 GB2312 |
| 開發習慣 | 要求嚴格編碼聲明 | 常忽略 Header charset 參數 |
<?php
header("Content-type: text/vnd.wap.wml; charset=utf-8");
// PHP 內部使用 UTF-8,或運行時轉換
$text = "歡迎訪問";
echo '' . $text . '
';
優勢:標準合規、跨平台、無亂碼風險。
劣勢:早期手機字庫不全導致顯示方塊、PHP 4 時代無原生多字節函數處理麻煩。
<?php
header("Content-type: text/vnd.wap.wml; charset=gb2312");
echo '你好
';
條件:目標手機確認支援 GB2312。風險:非標準、網關可能轉碼錯誤、SEO/抓取工具識別困難。
<?php
// 內部統一 UTF-8,輸出時按終端能力轉換
function wml_output($utf8_content, $target_charset = 'utf-8') {
header("Content-type: text/vnd.wap.wml; charset=$target_charset");
if (strtolower($target_charset) !== 'utf-8') {
$utf8_content = iconv('UTF-8', $target_charset . '//IGNORE', $utf8_content);
}
echo $utf8_content;
}
// 使用示例
$ua = $_SERVER['HTTP_USER_AGENT'];
$charset = (stripos($ua, 'Nokia') !== false || stripos($ua, 'Ericsson') !== false) ? 'utf-8' : 'gb2312';
wml_output('動態中文內容
', $charset);
<?php
$name = isset($_GET['name']) ? htmlspecialchars($_GET['name']) : '';
header("Content-type: text/vnd.wap.wml; charset=utf-8");
echo '';
echo '';
echo '姓名:
';
echo ' ';
echo ' ';
// template.wml
<?xml version="1.0"?>
<wml><card id="main" title="{TITLE}">
<p>{CONTENT}</p>
</card></wml>
<?php
$tpl = file_get_contents('template.wml');
$vars = ['TITLE' => '動態標題', 'CONTENT' => '來自數據庫的內容'];
echo strtr($tpl, $vars);
| WAP 概念 | 現代對應 | 核心思想傳承 |
|---|---|---|
| WML (標記語言) | HTML5 / AMP / MIP | 語義化標記、嚴格驗證、組件化 |
| WAP Gateway (轉碼壓縮) | CDN Edge / Service Worker / Brotli | 邊緣計算、協議優化、數據壓縮 |
| WBMP (極簡圖片) | SVG / WebP / AVIF | 適配設備能力、按需加載、矢量優先 |
| Deck/Card 導航模型 | SPA 路由 / PWA 頁面棧 | 狀態管理、歷史棧、離線緩存 |
| WTAI (電話應用接口) | WebRTC / Tel: URI / Contact Picker API | 設備能力暴露、權限模型、隱私保護 |
PHP 開發動態 WAP 頁面的核心挑戰在於編碼標準化、終端適配差異、標記語言嚴格性三者的平衡。雖然 WAP 已成歷史,但其面對的「受限環境下的可靠交付」問題,在物聯網設備、車載系統、低端智能機、新興市場輕量級應用中依然存在。掌握「統一內部編碼、邊界處轉換、優雅降級、漸進增強」的工程哲學,才是這段技術歷史留給我們最寶貴的遺產。