PHP实现全角字符转为半角方法汇总

前端技术 2023/09/02 PHP

最简单的方法

<?php  
$str = \"0123ABCDFWS\",.?<>{}[]*&^%#@!~()+-|:;\";  
echo \"$str\";  
echo \"<br />\";  
$str = preg_replace(\'/\\xa3([\\xa1-\\xfe])/e\', \'chr(ord(\\1)-0x80)\', $str);  
echo $str;

这是网上看来的代码,所有的中文标点的第二个字节减去0X80(即128)所得的数字就是半角所得的数字了。而/e模式表达的是:如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

在非UTF-8模式下这个函数是可行的,但是UTF-8下 这个方法就似乎无效,

方法二:

$queue = 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\');
echo preg_replace_callback(\"/([\\xEF][\\xBC][\\x90-\\x99]|[\\xEF][\\xBD][\\x81-\\x9A\\xA1-\\xBA])/\", \'next_fchar\', \'0\');
function next_fchar($matches){
 global $queue;
 return $queue[$matches[1]];
}

方法三:

/**
* 字符串半角和全角间相互转换
* @param string $str 待转换的字符串
* @param int  $type TODBC:转换为半角;TOSBC,转换为全角
* @return string 返回转换后的字符串
*/
function convertStrType($str, $type) {

    $dbc = array( 
      \'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\' , \'-\' , \' \' , \':\' ,
      \'.\' , \',\' , \'/\' , \'%\' , \'#\' ,
      \'!\' , \'@\' , \'&\' , \'(\' , \')\' ,
      \'<\' , \'>\' , \'"\' , \''\' , \'?\' ,
      \'[\' , \']\' , \'{\' , \'}\' , \'\\' ,
      \'|\' , \'+\' , \'=\' , \'_\' , \'^\' ,
      \'¥\' , \' ̄\' , \'`\'

);

    $sbc = array( //半角
      \'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\', \'-\', \' \', \':\',
      \'.\', \',\', \'/\', \'%\', \' #\',
      \'!\', \'@\', \'&\', \'(\', \')\',
      \'<\', \'>\', \'\"\', \'\\\'\',\'?\',
      \'[\', \']\', \'{\', \'}\', \'\\\\\',
      \'|\', \'+\', \'=\', \'_\', \'^\',
      \'¥\',\'~\', \'`\'

);
if($type == \'TODBC\'){
return str_replace( $sbc, $dbc, $str ); //半角到全角
}elseif($type == \'TOSBC\'){
return str_replace( $dbc, $sbc, $str ); //全角到半角
}else{
return $str;
}
}

方法四:

/**
* 将一个字串中含有全角的数字字符、字母、空格或\'%+-()\'字符转换为相应半角字符
*
* @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);
}

全角与半角之区别(来自中文维基百科)

全角,又称全形、全宽,是电脑字符的一种格式,字面意思是比普通字符(或半角字符)宽的字符。

传统上,英语或拉丁字母语言使用一字节的空间来存储,而汉字、日语等常使用两字节存储,在使用固定宽度文字的地方,为了使字体看起来整齐,英文字母、数字及其他符号,也由原来只占用一个字空间,改为一概占用两个字的空间来显示,并且使用两个字节来存储。

以上所述就是本文的全部内容了,希望大家能够喜欢。

本文地址:https://www.stayed.cn/item/4301

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。