萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 繁體中文/GB 字串處理工具函數庫

早期 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);

重要提醒

  • 編碼相依性: 此函數庫專為 GB2312/GBK/GB18030 設計,不適用於 UTF-8。UTF-8 中文字首位元組為 0xE0-0xEF,判斷邏輯完全不同。
  • 現代替代方案: PHP 5.2+ 內建 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 擴展。

copyright © 萬盛學電腦網 all rights reserved