在處理用戶輸入、數據清洗或跨系統交互時,常遇到全形(全角)與半形(半角)字符混雜的問題。直接使用 ASCII 碼轉換往往因編碼差異導致異常。最穩妥的方式是建立完整的字符映射表,逐一替換。
<?php
/**
* 全形字符轉換為半形
* @param string $str 輸入字符串
* @return string 轉換後字符串
*/
public function Sbc2Dbc($str) {
$arr = array(
// 數字
'0'=>'0', '1'=>'1', '2'=>'2', '3'=>'3', '4'=>'4',
'5'=>'5', '6'=>'6', '7'=>'7', '8'=>'8', '9'=>'9',
// 大寫字母
'A'=>'A', 'B'=>'B', 'C'=>'C', 'D'=>'D', 'E'=>'E',
'F'=>'F', 'G'=>'G', 'H'=>'H', 'I'=>'I', 'J'=>'J',
'K'=>'K', 'L'=>'L', 'M'=>'M', 'N'=>'N', 'O'=>'O',
'P'=>'P', 'Q'=>'Q', 'R'=>'R', 'S'=>'S', 'T'=>'T',
'U'=>'U', 'V'=>'V', 'W'=>'W', 'X'=>'X', 'Y'=>'Y', 'Z'=>'Z',
// 小寫字母
'a'=>'a', 'b'=>'b', 'c'=>'c', 'd'=>'d', 'e'=>'e',
'f'=>'f', 'g'=>'g', 'h'=>'h', 'i'=>'i', 'j'=>'j',
'k'=>'k', 'l'=>'l', 'm'=>'m', 'n'=>'n', 'o'=>'o',
'p'=>'p', 'q'=>'q', 'r'=>'r', 's'=>'s', 't'=>'t',
'u'=>'u', 'v'=>'v', 'w'=>'w', 'x'=>'x', 'y'=>'y', 'z'=>'z',
// 標點符號
'('=>'(', ')'=>')', '〔'=>'(', '〕'=>')', '【'=>'[', '】'=>']',
'〖'=>'[', '〗'=>']', '“'=>'"', '”'=>'"',
'‘'=>''', '''=>''', '{'=>'{', '}'=>'}',
'《'=>'<', '》'=>'>', '%'=>'%', '+'=>'+',
'—'=>'-', '-'=>'-', '~'=>'~', ':'=>':',
'。'=>'.', '、'=>',', ','=>',', '、'=>',',
';'=>';', '?'=>'?', '!'=>'!', '…'=>'-',
'‖'=>'|', '”'=>'"', '''=>'`', '‘'=>'`',
'|'=>'|', '〃'=>'"', ' '=>' ', '×'=>'*',
' ̄'=>'~', '.'=>'.', '*'=>'*', '&'=>'&',
'<'=>'<', '>'=>'>', '$'=>'$', '@'=>'@',
'^'=>'^', '_'=>'_', '"'=>'"', '¥'=>'$',
'='=>'=', '\'=>'\\', '/'=>'/'
);
return strtr($str, $arr);
}
<?php
$input = "Hello World!123";
$output = Sbc2Dbc($input);
echo $output; // Hello World!123
str_replace 數組形式,且不會出現「替換後又被再次替換」的問題。同理構建反向映射表即可:
function Db2Sbc($str) {
$arr = array_flip($GLOBALS['sbc2dbc_map']); // 假設映射表為全局變量
return strtr($str, $arr);
}
通過建立完整的字符映射表並使用 strtr,可穩健解決全半形轉換問題。此法不依賴特定編碼邏輯,兼容性強,適合表單驗證、搜索關鍵詞預處理、數據導入清洗等場景。