在PHP开发的实际场景中,用户输入的内容可能包含全角字符,比如全角空格、全角数字、全角标点等,这些字符如果不转换为半角,可能会导致数据校验失败、存储格式不统一或者展示异常。因此掌握PHP字符串全角转半角的方法是非常有必要的。

全角半角字符的基本规律
全角字符和半角字符在ASCII编码和Unicode编码中存在固定的偏移关系。对于常见的全角数字、字母、英文标点,其Unicode编码比对应的半角字符的Unicode编码大65248。而全角空格的Unicode编码是12288,对应的半角空格编码是32,这个需要单独处理。
方法一:使用str_replace配合数组批量转换
我们可以先定义全角字符和半角字符的对应数组,然后使用str_replace函数完成批量替换,这种方法逻辑清晰,适合处理固定范围的全角字符。
<?php
/**
* 全角转半角函数
* @param string $str 待转换的字符串
* @return string 转换后的半角字符串
*/
function fullToHalf($str) {
// 全角字符数组
$fullWidth = [
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J',
'K','L','M','N','O','P','Q','R','S','T',
'U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z',
'!','"','#','$','%','&',''','(',')','*',
'+',',','-','.','/',':',';','<','=','>',
'?','@','[','\',']','^','_','`','{','|',
'}','~',' '
];
// 对应的半角字符数组
$halfWidth = [
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J',
'K','L','M','N','O','P','Q','R','S','T',
'U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z',
'!','"','#','$','%','&',''','(',')','*',
'+',',','-','.','/':',':',';','<','=','>',
'?','@','[','\',']','^','_','`','{','|',
'}','~',' '
];
return str_replace($fullWidth, $halfWidth, $str);
}
// 测试示例
$testStr = 'Hello World! 全角数字:123 全角空格测试';
$result = fullToHalf($testStr);
echo $result; // 输出 Hello World! 全角数字:123 全角空格测试
?>
方法二:利用编码偏移关系动态转换
根据全角字符和半角字符的Unicode编码偏移规律,可以遍历字符串的每个字符,判断其编码范围后动态转换,这种方法不需要定义庞大的字符数组,适用性更强。
<?php
/**
* 基于编码偏移的全角转半角函数
* @param string $str 待转换的字符串
* @return string 转换后的半角字符串
*/
function fullToHalfByCode($str) {
// 将字符串拆分为字符数组
$chars = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
$result = '';
foreach ($chars as $char) {
$charCode = mb_ord($char, 'UTF-8');
// 处理全角空格
if ($charCode === 12288) {
$result .= ' ';
}
// 处理全角数字、字母、英文标点(偏移65248)
elseif ($charCode >= 65281 && $charCode <= 65374) {
$result .= mb_chr($charCode - 65248, 'UTF-8');
}
// 其他字符直接拼接
else {
$result .= $char;
}
}
return $result;
}
// 测试示例
$testStr = 'PHP 全角转半角测试:1+2=3?';
$result = fullToHalfByCode($testStr);
echo $result; // 输出 PHP 全角转半角测试:1+2=3?
?>
方法三:使用mbstring扩展的mb_convert_kana函数
如果服务器开启了mbstring扩展,可以直接使用内置的mb_convert_kana函数实现全角半角转换,这是最便捷的方式。
<?php
/**
* 使用mb_convert_kana实现全角转半角
* @param string $str 待转换的字符串
* @return string 转换后的半角字符串
*/
function fullToHalfByMb($str) {
// 参数r表示将全角字母数字转为半角,s表示将全角空格转为半角
return mb_convert_kana($str, 'rs', 'UTF-8');
}
// 测试示例
$testStr = 'Test 123 @ #';
$result = fullToHalfByMb($testStr);
echo $result; // 输出 Test 123 @ #
?>
三种方法对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| str_replace数组替换 | 逻辑直观,不需要依赖扩展 | 需要定义大量字符数组,维护成本高 | 固定范围的全角字符转换,无mbstring扩展的环境 |
| 编码偏移动态转换 | 无需定义数组,覆盖全角字符范围全 | 需要遍历字符,性能略低于数组替换 | 需要转换各类全角字符,无mbstring扩展的环境 |
| mb_convert_kana函数 | 代码简洁,性能优秀,支持多种转换规则 | 依赖mbstring扩展 | 服务器已开启mbstring扩展的场景 |
注意事项
- 转换前需要确认字符串的编码是UTF-8,避免编码不一致导致转换错误
- 如果只需要转换部分字符,可以调整对应方法的字符范围或者参数
- 使用
mb_convert_kana时,要确认服务器是否开启了mbstring扩展,可以通过phpinfo()查看 - 全角中文汉字不需要转换为半角,上述方法都不会处理中文汉字,只处理全角英文、数字、标点和空格