php 把全角字符转换成半角

本文介绍了一个简单的PHP函数,用于将包含全角字符的字符串转换为半角字符,以减少系统识别问题。通过映射表进行字符替换,适用于多种全角字符,包括数字、字母、空格、特殊符号等。
经常遇到用户把英文字符或者标点符号写成了全角,有时候会导致系统无法识别,所以应该先把全角的字符全部转换成正常的半角,减少问题存在。其实原理很简单,也很笨吧,就是把所有的全角字符替换成对应的半角字符,摘自ecshop开源代码里面。
/**
 *  将一个字串中含有全角的数字字符、字母、空格或'%+-()'字符转换为相应半角字符
 *
 * @access  public
 * @param   string       $str         待转换字串
 *
 * @return  string       $str         处理后字串
 */
function make_semiangle($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);
}

<think>根据用户需求,需要将字串中的全角字转换半角。参考提供的引用内容,特别是引用[2]中Python实现方法,以及引用[3]中提到Java使用ICU库的方法。全角字半角转换规则:1.全角空格(Unicode12288)转换半角空格(32)2.全角字(除空格)在Unicode中范围为65281到65374,转换半角只需减去65248(因为半角对应的Unicode码值比全角小65248)3.其他字保持不变我们将提供几种常见编程语言的实现。首先,Python实现(参考引用[2]并修正注释):```pythondeffull_to_half(text:str)->str:"""将字串中的全角字转换半角"""result=[]forcharintext:inside_code=ord(char)ifinside_code==12288:#全角空格result.append(chr(32))elif65281<=inside_code<=65374:#全角字(除空格)result.append(chr(inside_code-65248))else:result.append(char)return''.join(result)```其次,Java实现(参考引用[3]使用ICU库,但也可以自己实现转换):如果项目允许使用第三方库,推荐使用ICU4J,因为日语等字转换更复杂。但若仅是中英文全半角转换,可自行实现。自行实现的Java版本:```javapublicstaticStringfullToHalf(Stringtext){StringBuildersb=newStringBuilder(text.length());for(inti=0;i< text.length();i++){charc=text.charAt(i);intcode=(int)c;if(code==12288){//全角空格sb.append((char)32);}elseif(code>=65281&&code<=65374){sb.append((char)(code-65248));}else{sb.append(c);}}returnsb.toString();}```使用ICU4J的Java版本(需要添加依赖):```javaimportcom.ibm.icu.text.Transliterator;publicclassHalfWidthConverter{publicstaticStringfullToHalf(Stringtext){//创建转换规则,将全角字转换半角Transliteratortransliterator=Transliterator.getInstance("Fullwidth-Halfwidth");returntransliterator.transliterate(text);}}```接下来是JavaScript实现:```javascriptfunctionfullToHalf(text){letresult='';for(leti=0;i< text.length;i++){constcharCode=text.charCodeAt(i);if(charCode===12288){result+=String.fromCharCode(32);//全角空格半角空格}elseif(charCode>=65281&&charCode<=65374){result+=String.fromCharCode(charCode-65248);}else{result+=text[i];}}returnresult;}```最后是PHP实现:```phpfunctionfull_to_half($text){$len=mb_strlen($text,'UTF-8');$result='';for($i=0;$i< $len;$i++){$char=mb_substr($text,$i,1,'UTF-8');$code=mb_ord($char);//需要自定义mb_ord函数,因为PHP没有内置函数直接获取Unicode码点if($code===12288){$result.=chr(32);}elseif($code>=65281&&$code<=65374){$result.=chr($code-65248);}else{$result.=$char;}}return$result;}//自定义函数:获取UTF-8字的Unicode码点if(!function_exists('mb_ord')){functionmb_ord($char){$k=mb_convert_encoding($char,'UCS-2LE','UTF-8');$k1=ord(substr($k,0,1));$k2=ord(substr($k,1,1));return$k2*256+$k1;}}```注意:PHP版本中,我们自定义了`mb_ord`函数来获取UTF-8字的Unicode码点,因为PHP没有内置的函数。这里转换方法是将字转换为UCS-2LE编码然后计算码点,但要注意这种方法只能处理BMP平面内的字(基本多语言平面)。对于辅助平面的字(如emoji)可能会出错。不过全角字都在BMP平面内,所以对于全角半角是安全的。以上各语言实现均遵循了全角半角的基本规则。对于其他语言(如C++等)也可以类似实现。另外,要注意:转换函数对数字、字母、标点号有效,对于其他全角字(如日文、韩文等)可能不在这个范围内,需要根据具体需求扩展规则。最后,生成相关问题:§§相关问题§§1.如何实现半角全角字转换?2.转换全角字时如何处理特殊语言的全角字(如日文)?3.在转换过程中如何保留原始格式(如换行)?4.全半角转换在文本规范化中还有哪些应用?5.如何在数据库中批量更新全角字半角?</think> ### 全角字半角的实现方案 全角字(如中文标点、字母和数字)占两个字节宽度,半角为单字节宽度。转换核心原理是根据 Unicode 编码规则进行映射[^1][^2]。 #### Python 实现 ```python def full_to_half(text: str) -> str: """全角半角(支持中英文及号)""" result = [] for char in text: code = ord(char) if code == 12288: # 全角空格 result.append(chr(32)) elif 65281 <= code <= 65374: # 全角字范围 result.append(chr(code - 65248)) else: result.append(char) return ''.join(result) # 示例 original = "“ABC123”(全角)" converted = full_to_half(original) # 输出:"\"ABC123\"(半角)" ``` > 实现原理:全角字的 Unicode 编码比半角大65248[^2] #### Java 实现 (ICU4J 库) ```java import com.ibm.icu.text.Transliterator; String halfWidthToFullWidth(String text) { Transliterator transliterator = Transliterator.getInstance("Fullwidth-Halfwidth"); return transliterator.transliterate(text); } ``` > ICU4J 提供专业的多语言转换支持,特别适合处理日韩文字混排场景[^3] #### JavaScript 实现 ```javascript function fullToHalf(str) { return str.replace(/[\uFF01-\uFF5E]/g, char => String.fromCharCode(char.charCodeAt(0) - 65248) ).replace(/\u3000/g, '\u0020'); // 处理空格 } ``` #### 转换规则详解 | 字类型 | 全角范围 | 半角范围 | 差值 | |----------------|--------------|--------------|-------| | 数字/字母 | FF01-FF5E | 21-7E | 65248 | | 空格 | 3000 | 20 | - | | 中文标点 | 特殊处理 | 保留原样 | - |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值