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

PHP 字符串處理:全角半角字符互轉完整實現方案

     編輯:PHP 相關知識

編碼知識基礎

字符類型Unicode 範圍(十進制)Unicode 範圍(十六進制)
全角字符65281 ~ 653740xFF01 ~ 0xFF5E
半角字符33 ~ 1260x21 ~ 0x7E
全角空格122880x3000
半角空格320x20

規律:除空格外,全角/半角字符 Unicode 碼位差值固定為 0xFEE0 (65248)。全角 = 半角 + 0xFEE0。

核心工具函數:Unicode 與 UTF-8 互轉


/**
 * Unicode 碼位轉 UTF-8 字符
 * @param int $unicode
 * @return string UTF-8 字符
 */
function unicode2Char($unicode) {
    if ($unicode < 128) return chr($unicode);
    if ($unicode < 2048) return chr(($unicode >> 6) + 192) . chr(($unicode & 63) + 128);
    if ($unicode < 65536) return chr(($unicode >> 12) + 224) . chr((($unicode >> 6) & 63) + 128) . chr(($unicode & 63) + 128);
    if ($unicode < 2097152) return chr(($unicode >> 18) + 240) . chr((($unicode >> 12) & 63) + 128) . chr((($unicode >> 6) & 63) + 128) . chr(($unicode & 63) + 128);
    return false;
}

/**
 * UTF-8 字符轉 Unicode 碼位
 * @param string $char 單個 UTF-8 字符
 * @return int|false
 */
function char2Unicode($char) {
    $len = strlen($char);
    if ($len == 1) return ord($char);
    if ($len == 2) return (ord($char[1]) & 63) | ((ord($char[0]) & 31) << 6);
    if ($len == 3) return (ord($char[2]) & 63) | ((ord($char[1]) & 63) << 6) | ((ord($char[0]) & 15) << 12);
    if ($len == 4) return (ord($char[3]) & 63) | ((ord($char[2]) & 63) << 6) | ((ord($char[1]) & 63) << 12) | ((ord($char[0]) & 7) << 18);
    trigger_error('Invalid UTF-8 character', E_USER_WARNING);
    return false;
}

全角轉半角 (SBC → DBC)


function sbc2Dbc($str) {
    return preg_replace_callback(
        '/[\x{3000}\x{FF01}-\x{FF5E}]/u',
        function ($matches) {
            $unicode = char2Unicode($matches[0]);
            if ($unicode === 0x3000) return ' ';  // 全角空格
            $code = $unicode - 0xFEE0;
            return ($code > 255) ? unicode2Char($code) : chr($code);
        },
        $str
    );
}

半角轉全角 (DBC → SBC)


function dbc2Sbc($str) {
    return preg_replace_callback(
        '/[\x{0020}\x{0021}-\x{007E}]/u',
        function ($matches) {
            $unicode = char2Unicode($matches[0]);
            if ($unicode === 0x0020) return unicode2Char(0x3000);  // 半角空格
            $code = $unicode + 0xFEE0;
            return ($code > 255) ? unicode2Char($code) : chr($code);
        },
        $str
    );
}

注意:使用 preg_replace_callback 替代已棄用的 /e 修飾符,支援 PHP 7+。

測試驗證


$a = 'abc12 345';           // 半角
$sbc = dbc2Sbc($a);         // → 'abc12 345'
$dbc = sbc2Dbc($sbc);       // → 'abc12 345'

var_dump($a, $sbc, $dbc);
/*
string(9) "abc12 345"
string(27) "abc12 345"
string(9) "abc12 345"
*/

應用場景

  • 用戶輸入正規化(搜尋、比對、入庫前統一半角)
  • 表單驗證(身份證、手機號、郵箱強制半角)
  • 跨系統數據交換(舊系統全角、新系統半角)
  • PDF/報表生成(對齊需求用全角)

擴展:mbstring 替代方案


// 需啟用 mbstring 擴展
mb_convert_kana($str, 'KV', 'UTF-8');  // 全角轉半角
mb_convert_kana($str, 'kv', 'UTF-8');  // 半角轉全角
// 選項:K=片假名轉平假名, V=濁音合併, k=平假名轉片假名, v=濁音展開

mb_convert_kana 專為日文設計,但對中文全半角轉換同樣有效,性能更優、邊界情況處理更完善。

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