用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > php教程

php实现获取汉字的首字母两个实例

时间:2015-01-23  来源:西部数据  作者:西部数据

要获取汉字首字母的方法有很多,这个我们一般要把汉字分出来然后转换成拼音,然后再利用substr取第一个字母了,下面我网上找到两个实例,各有千秋大家一起来看看吧.

例1,主要功能是:功能明确,易于修改维护和扩展;英文的字串:不变返回(包括数字);中文字符串:返回拼音首字符; 中英混合串:返回拼音首字符和英文,该算法采用了二分法查找,修复了之前字母Z读取成Y的错误,代码如下:

  1. <?php  
  2.  /** 
  3. * 修复二分法查找方法 
  4. * 汉字拼音首字母工具类 
  5. *  注: 英文的字串:不变返回(包括数字)    eg .abc123 => abc123 
  6. *      中文字符串:返回拼音首字符        eg. 测试字符串 => CSZFC 
  7. *      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ 
  8. *  eg. 
  9. *  $py = new str2PY(); 
  10. *  $result = $py->getInitials('啊吧才的饿飞就好i就看了吗你哦平去人是他uv我想一在'); 
  11. */ 
  12. class str2PY 
  13.     private $_pinyins = array
  14.         176161 => 'A'
  15.         176197 => 'B'
  16.         178193 => 'C'
  17.         180238 => 'D'
  18.         182234 => 'E'
  19.         183162 => 'F'
  20.         184193 => 'G'
  21.         185254 => 'H'
  22.         187247 => 'J'
  23.         191166 => 'K'
  24.         192172 => 'L'
  25.         194232 => 'M'
  26.         196195 => 'N'
  27.         197182 => 'O'
  28.         197190 => 'P'
  29.         198218 => 'Q'
  30.         200187 => 'R'
  31.         200246 => 'S'
  32.         203250 => 'T'
  33.         205218 => 'W'
  34.         206244 => 'X'
  35.         209185 => 'Y'
  36.         212209 => 'Z'
  37.     ); 
  38.     private $_charset = null; 
  39.     /** 
  40.      * 构造函数, 指定需要的编码 default: utf-8 
  41.      * 支持utf-8, gb2312 
  42.      * 
  43.      * @param unknown_type $charset 
  44.      */ 
  45.     public function __construct( $charset = 'utf-8' ) 
  46.     { 
  47.         $this->_charset    = $charset
  48.     } 
  49.     /** 
  50.      * 中文字符串 substr 
  51.      * 
  52.      * @param string $str 
  53.      * @param int    $start 
  54.      * @param int    $len 
  55.      * @return string 
  56.      */ 
  57.     private function _msubstr ($str$start$len
  58.     { 
  59.         $start  = $start * 2; 
  60.         $len    = $len * 2; 
  61.         $strlen = strlen($str); 
  62.         $result = ''
  63.         for ( $i = 0; $i < $strlen$i++ ) { 
  64.             if ( $i >= $start && $i < ($start + $len) ) { 
  65.                 if ( ord(substr($str$i, 1)) > 129 ) $result .= substr($str$i, 2); 
  66.                 else $result .= substr($str$i, 1); 
  67.             } 
  68.             if ( ord(substr($str$i, 1)) > 129 ) $i++; 
  69.         } 
  70.         return $result
  71.     } 
  72.     /** 
  73.      * 字符串切分为数组 (汉字或者一个字符为单位) 
  74.      * 
  75.      * @param string $str 
  76.      * @return array 
  77.      */ 
  78.     private function _cutWord( $str ) 
  79.     { 
  80.         $words = array(); 
  81.          while ( $str != "" ) 
  82.          { 
  83.             if ( $this->_isAscii($str) ) {/*非中文*/ 
  84.                 $words[] = $str[0]; 
  85.                 $str = substr$strstrlen($str[0]) ); 
  86.             }else
  87.                 $word = $this->_msubstr( $str, 0, 1 ); 
  88.                 $words[] = $word
  89.                 $str = substr$strstrlen($word) ); 
  90.             } 
  91.          } 
  92.          return $words
  93.     } 
  94.     /** 
  95.      * 判断字符是否是ascii字符 
  96.      * 
  97.      * @param string $char 
  98.      * @return bool 
  99.      */ 
  100.     private function _isAscii( $char ) 
  101.     { 
  102.         return ( ord( substr($char,0,1) ) < 160 ); 
  103.     } 
  104.     /** 
  105.      * 判断字符串前3个字符是否是ascii字符 
  106.      * 
  107.      * @param string $str 
  108.      * @return bool 
  109.      */ 
  110.     private function _isAsciis( $str ) 
  111.     { 
  112.         $len = strlen($str) >= 3 ? 3: 2; 
  113.         $chars = array(); 
  114.         for$i = 1; $i < $len -1; $i++ ){ 
  115.             $chars[] = $this->_isAscii( $str[$i] ) ? 'yes':'no'
  116.         } 
  117.         $result = array_count_values$chars ); 
  118.         if ( emptyempty($result['no']) ){ 
  119.             return true; 
  120.         } 
  121.         return false; 
  122.     } 
  123.     /** 
  124.      * 获取中文字串的拼音首字符 
  125.      * 
  126.      * @param string $str 
  127.      * @return string 
  128.      */ 
  129.     public function getInitials( $str ) 
  130.     { 
  131.         if ( emptyempty($str) ) return ''
  132.         if ( $this->_isAscii($str[0]) && $this->_isAsciis( $str )){ 
  133.             return $str
  134.         } 
  135.         $result = array(); 
  136.         if ( $this->_charset == 'utf-8' ){ 
  137.             $str = iconv( 'utf-8''gb2312'$str ); 
  138.         } 
  139.         $words = $this->_cutWord( $str ); 
  140.         foreach ( $words as $word ) 
  141.         { 
  142.             if ( $this->_isAscii($word) ) {/*非中文*/ 
  143.                 $result[] = $word
  144.                 continue
  145.             } 
  146.             $code = ord( substr($word,0,1) ) * 1000 + ord( substr($word,1,1) ); 
  147.             /*获取拼音首字母A--Z*/ 
  148.             if ( ($i = $this->_search($code)) != -1 ){ 
  149.                 $result[] = $this->_pinyins[$i]; 
  150.             } 
  151.         } 
  152.         return strtoupper(implode('',$result)); 
  153.     } 
  154.     private function _getChar( $ascii ) 
  155.     { 
  156.         if ( $ascii >= 48 && $ascii <= 57){ 
  157.             return chr($ascii);  /*数字*/ 
  158.         }elseif ( $ascii>=65 && $ascii<=90 ){ 
  159.             return chr($ascii);   /* A--Z*/ 
  160.         }elseif ($ascii>=97 && $ascii<=122){ 
  161.             return chr($ascii-32); /* a--z*/ 
  162.         }else
  163.             return '-'/*其他*/ 
  164.         } 
  165.     } 
  166.  
  167.     /** 
  168.      * 查找需要的汉字内码(gb2312) 对应的拼音字符( 二分法 ) 
  169.      * 
  170.      * @param int $code 
  171.      * @return int 
  172.      */ 
  173.     private function _search( $code ) 
  174.     { 
  175.         $data = array_keys($this->_pinyins); 
  176.         $lower = 0; 
  177.         $upper = sizeof($data)-1; 
  178.   $middle = (int) round(($lower + $upper) / 2); 
  179.         if ( $code < $data[0] ) return -1; 
  180.         for (;;) { 
  181.             if ( $lower > $upper ){ 
  182.                 return $data[$lower-1]; 
  183.             } 
  184.             $tmp = (int) round(($lower + $upper) / 2); 
  185.             if ( !isset($data[$tmp]) ){ 
  186.     return $data[$middle]; 
  187.             }else{  
  188.     $middle = $tmp
  189.    } 
  190.             if ( $data[$middle] < $code ){ 
  191.                 $lower = (int)$middle + 1; 
  192.             }else if ( $data[$middle] == $code ) { 
  193.                 return $data[$middle]; 
  194.             }else
  195.                 $upper = (int)$middle - 1; 
  196.             } 
  197.         } 
  198.     } 
  199. ?> 

例2,取汉字的asc区间然后返回汉字首字母了,代码如下:

  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  2. <?php   
  3. function getfirstchar($s0){     
  4.     $fchar = ord($s0{0});  
  5.     if($fchar >= ord("A"and $fchar <= ord("z") )return strtoupper($s0{0});  
  6.     $s1 = iconv("UTF-8","gb2312"$s0);  
  7.     $s2 = iconv("gb2312","UTF-8"$s1);  
  8.     if($s2 == $s0){$s = $s1;}else{$s = $s0;}  
  9.     $asc = ord($s{0}) * 256 + ord($s{1}) - 65536;  
  10.     if($asc >= -20319 and $asc <= -20284) return "A";  
  11.     if($asc >= -20283 and $asc <= -19776) return "B";  
  12.     if($asc >= -19775 and $asc <= -19219) return "C";  
  13.     if($asc >= -19218 and $asc <= -18711) return "D";  
  14.     if($asc >= -18710 and $asc <= -18527) return "E";  
  15.     if($asc >= -18526 and $asc <= -18240) return "F";  
  16.     if($asc >= -18239 and $asc <= -17923) return "G";  
  17.     if($asc >= -17922 and $asc <= -17418) return "I";  
  18.     if($asc >= -17417 and $asc <= -16475) return "J";  
  19.     if($asc >= -16474 and $asc <= -16213) return "K";  
  20.     if($asc >= -16212 and $asc <= -15641) return "L";  
  21.     if($asc >= -15640 and $asc <= -15166) return "M";  
  22.     if($asc >= -15165 and $asc <= -14923) return "N";  
  23.     if($asc >= -14922 and $asc <= -14915) return "O";  
  24.     if($asc >= -14914 and $asc <= -14631) return "P";  
  25.     if($asc >= -14630 and $asc <= -14150) return "Q";  
  26.     if($asc >= -14149 and $asc <= -14091) return "R";  
  27.     if($asc >= -14090 and $asc <= -13319) return "S";  
  28.     if($asc >= -13318 and $asc <= -12839) return "T";  
  29.     if($asc >= -12838 and $asc <= -12557) return "W";  
  30.     if($asc >= -12556 and $asc <= -11848) return "X";  
  31.     if($asc >= -11847 and $asc <= -11056) return "Y";  
  32.     if($asc >= -11055 and $asc <= -10247) return "Z";  
  33.     return null;  
  34. }  
  35.    
  36.    
  37. function pinyin1($zh){  
  38.     $ret = "";  
  39.     $s1 = iconv("UTF-8","gb2312"$zh);  
  40.     $s2 = iconv("gb2312","UTF-8"$s1);  
  41.     if($s2 == $zh){$zh = $s1;}  
  42.     for($i = 0; $i < strlen($zh); $i++){  
  43.         $s1 = substr($zh,$i,1);  
  44.         $p = ord($s1);  
  45.         if($p > 160){  
  46.             $s2 = substr($zh,$i++,2);  
  47.             $ret .= getfirstchar($s2);  
  48.         }else{  
  49.             $ret .= $s1;  
  50.         }  
  51.     }  
  52.     return $ret;  
  53. }  
  54. echo "这是中文字符串<br/>";  
  55. echo pinyin1('这是中文字符串'); 
  56. ?> 
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
    无相关信息
栏目更新
栏目热门