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


  本文标签: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);
}

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

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

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

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