早期 PHP 缺乏原生多位元組字串函數(mbstring)時,開發者需自行撰寫處理 Big5/GB2312 編碼中文字串的工具。本文整理一套經典的中文字串處理函數庫,涵蓋長度計算、截取、搜尋、取代、大小寫轉換、反轉、空白處理等功能,並說明其運作原理與現代替代方案。
| 分類 | 函數名稱 | 功能說明 |
|---|---|---|
| 空白處理 | GBspace($str) | 中文字之間插入空白 |
GBunspace($str) | 移除中文字之間的空白 | |
clear_space($str) | 清除多餘連續空白 | |
| 轉換 | GBcase($str, $mode) | 大小寫轉換:upper/lower/ucwords/ucfirst |
GBrev($str) | 字串反轉(正確處理雙位元組字元) | |
| 檢查 | GB_check($str) | 檢查是否包含中文字(GB 碼) |
GB_all($str) | 檢查是否全為中文字 | |
GB_non($str) | 檢查是否全非中文字 | |
GBlen($str) | 取得字串長度(中文算 1 字元) | |
| 搜尋/取代/擷取 | GBpos($haystack, $needle, $offset) | 查找位置,支援首次/最後/所有位置(陣列) |
GB_replace($needle, $replace, $haystack) | 查找並取代(區分大小寫) | |
GB_replace_i($needle, $pre, $post, $haystack) | 不區分大小寫取代,可加前後綴 | |
GBsubstr($str, $start, $length) | 中文安全截取,支援正負索引 | |
GBstrnear($str, $length) | 擷取最接近指定長度的字串(中文算 2 位元組) | |
所有函數核心邏輯相同:逐位元組掃描,判斷是否為雙位元組中文字首位元組(ord($ch) >= 0x81 且 ord($ch2) >= 0x40)。若符合,視為一個中文字元,指標前進 2;否則視為單位元組字元,指標前進 1。
// GBlen 核心邏輯範例
function GBlen($string) {
$len = strlen($string);
$count = 0;
$i = 0;
while ($i < $len) {
$ch = $string[$i];
$ch2 = $string[$i+1] ?? '';
if (ord($ch) >= 0x81 && ord($ch2) >= 0x40) {
$i += 2; // 雙位元組字元
} else {
$i += 1; // 單位元組字元
}
$count++;
}
return $count;
}
<?php
include('GB.inc'); // 載入函數庫
// 表單資料請先處理 magic_quotes
$str = stripslashes($_POST['content']);
// 計算中文長度
echo GBlen($str); // 中文算 1,英文算 1
// 安全截取前 50 個中文字元
$excerpt = GBsubstr($str, 0, 50);
if (GBlen($str) > 50) $excerpt .= '...';
// 關鍵字高亮(不分大小寫)
$highlighted = GB_replace_i('關鍵字', '<mark>', '</mark>', $str);
0xE0-0xEF,判斷邏輯完全不同。mbstring 延伸模組,提供 mb_strlen()、mb_substr()、mb_strpos()、mb_strtolower() 等完整函數,強烈建議直接使用 mbstring,支援 UTF-8、Big5、GBK 等多種編碼。iconv() 可在編碼間轉換:iconv('GBK', 'UTF-8//IGNORE', $str)// 舊寫法 (GB 函數庫)
$len = GBlen($str);
$sub = GBsubstr($str, 0, 20);
// 新寫法 (mbstring,需設定內部編碼)
mb_internal_encoding('UTF-8');
$len = mb_strlen($str);
$sub = mb_substr($str, 0, 20);
此函數庫具有歷史參考價值,展示早期 PHP 開發者如何在缺乏原生支援下解決中文處理問題。現代專案請直接使用 mbstring 或 intl 擴展。