Posted in PHP onApril 24, 2014
一、公司同事整理的类,挺实用的.相信拿出来分享下他不会介意的O(∩_∩)O.不过如果首字母是数字或英文会有些问题.
/** * Helper_Spell 汉字拼音首字母工具类 * * @category Helper * @package Helper_Spell * @author Lancer <lancer.he@gmail.com> * @version 1.0 * @see Translation_Big2gb */ class Helper_Spell { /** * $_pinyins * @var array * @access private */ private $_pinyins = array( 176161 => 'A', 176197 => 'B', 178193 => 'C', 180238 => 'D', 182234 => 'E', 183162 => 'F', 184193 => 'G', 185254 => 'H', 187247 => 'J', 191166 => 'K', 192172 => 'L', 194232 => 'M', 196195 => 'N', 197182 => 'O', 197190 => 'P', 198218 => 'Q', 200187 => 'R', 200246 => 'S', 203250 => 'T', 205218 => 'W', 206244 => 'X', 209185 => 'Y', 212209 => 'Z', 215249 => 'Z', ); /** * $_charset * @var string * @access private */ private $_charset = null; /** * __construct 构造函数, 指定需要的编码 default: utf-8 支持utf-8, gb2312 * * @param unknown_type $charset */ public function __construct( $charset = 'utf-8' ) { $this->_charset = $charset; } /** * getInitialsFirst 返回首个汉字的拼音 * * @access public * @static * @param string $str * @return string * @example Helper_Spell::getInitialsFirst('我的爱'); => w */ public static function getInitialsFirst( $str, $charset = 'utf-8' ) { $chars = array( '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'); $string = self::getInitials( $str ); $length = strlen($string); for($i=0; $i < $length; $i++) { if ( in_array( $string{$i}, $chars ) ) { return $string{$i}; } } return '*'; } /** * getInitials 返回拼音组合 * * @access public * @static * @param string $str * @return string * @example Helper_Spell::getInitials('我的爱'); => wda */ public static function getInitials( $str, $charset = 'utf-8' ) { $instance = new Helper_Spell( $charset ); return $instance->_getInitials( $str ); } /** * _getInitials 获取中文字串的拼音首字符 * 注:英文的字串:不变返回(包括数字) eg .abc123 => abc123 * 中文字符串:返回拼音首字符 eg. 王小明 => WXM * 中英混合串: 返回拼音首字符和英文 eg. 我i我j => WIWJ * * @access private * @param string $str * @return string */ private function _getInitials( $str, $translation=TRUE ){ if ( empty($str) ) return ''; if ( $this->_isAscii($str[0]) && $this->_isAsciis( $str )) return $str; if ( $translation ) $str = Translation_Big2gb::big2gb( $str ); $result = array(); if ( $this->_charset == 'utf-8' ){ //IGNORE很重要,加上这个就可以是ICONV()函数忽略错误,继续执行 $str = iconv( 'utf-8', 'gbk//IGNORE', $str ); } $words = $this->_cutWord( $str ); foreach ( $words AS $word ) { if ( $this->_isAscii($word) ) {//非中文 $result[] = $word; continue; } $code = ( ord(substr($word,0,1)) ) * 1000 + (ord(substr($word,1,1))); //获取拼音首字母A--Z if ( ($i = $this->_search($code)) != -1 ){ $result[] = $this->_pinyins[$i]; } } return strtoupper(implode('', $result)); } /** * _msubstr 获取中文字符串 * * @access private * @param string $str * @param int $start * @param int $len * @return string */ private function _msubstr ($str, $start, $len) { $start = $start * 2; $len = $len * 2; $strlen = strlen($str); $result = ''; for ( $i = 0; $i < $strlen; $i++ ) { if ( $i >= $start && $i < ($start + $len) ) { if ( ord(substr($str, $i, 1)) > 129 ) $result .= substr($str, $i, 2); else $result .= substr($str, $i, 1); } if ( ord(substr($str, $i, 1)) > 129 ) $i++; } return $result; } /** * _cutWord 字符串切分为数组 (汉字或者一个字符为单位) * * @access private * @param string $str * @return array */ private function _cutWord( $str ) { $words = array(); while ( $str != "" ) { if ( $this->_isAscii($str) ) {//非中文 $words[] = $str[0]; $str = substr( $str, strlen($str[0]) ); } else { $word = $this->_msubstr( $str, 0, 1 ); $words[] = $word; $str = substr( $str, strlen($word) ); } } return $words; } /** * _isAscii 判断字符是否是ascii字符 * * @access private * @param string $char * @return bool */ private function _isAscii( $char ) { return ( ord( substr($char,0,1) ) < 160 ); } /** * _isAsciis 判断字符串前3个字符是否是ascii字符 * * @access private * @param string $str * @return bool */ private function _isAsciis( $str ) { $len = strlen($str) >= 3 ? 3: 2; $chars = array(); for( $i = 1; $i < $len -1; $i++ ){ $chars[] = $this->_isAscii( $str[$i] ) ? 'yes':'no'; } $result = array_count_values( $chars ); if ( empty($result['no']) ){ return true; } return false; } /** * _getChar 通过ASC码返回字母或者数字 * * @access private * @param string $ascii * @return string */ private function _getChar( $ascii ){ if ( $ascii >= 48 && $ascii <= 57 ) { return chr($ascii); //数字 } elseif ( $ascii>=65 && $ascii<=90 ) { return chr($ascii); // A--Z } elseif ($ascii>=97 && $ascii<=122 ) { return chr($ascii-32); // a--z } else { return '~'; //其他 } } /** * _search 查找需要的汉字内码(gb2312) 对应的拼音字符(二分法) * * @access private * @param int $code * @return int */ private function _search( $code ) { $data = array_keys($this->_pinyins); $lower = 0; $upper = sizeof($data)-1; // 排除非一级汉字 if ($code < $data[0] || $code > $data[23]) return -1; for (;;) { if ( $lower > $upper ){ return $data[$lower-1]; } $middle = (int) round(($lower + $upper) / 2); if ( !isset($data[$middle]) ) { return -1; } if ( $data[$middle] < $code ){ $lower = (int)$middle + 1; } else if ( $data[$middle] == $code ) { return $data[$middle]; } else { $upper = (int)$middle - 1; } }// end for } }
二、用来得到中文的首字母
这个是将中文转换为拼音的类:charset
<?php /** * 汉字转化为拼音,拼音转化为汉字 * */ class charset { private $_code=array( array("a",'-20319'), array("ai",'-20317'), array("an",'-20304'), array("ang",'-20295'), array("ao",'-20292'), array("ba",'-20283'), array("bai",'-20265'), array("ban",'-20257'), array("bang",'-20242'), array("bao",'-20230'), array("bei",'-20051'), array("ben",'-20036'), array("beng",'-20032'), array("bi",'-20026'), array("bian",'-20002'), array("biao",'-19990'), array("bie",'-19986'), array("bin",'-19982'), array("bing",'-19976'), array("bo",'-19805'), array("bu",'-19784'), array("ca",'-19775'), array("cai",'-19774'), array("can",'-19763'), array("cang",'-19756'), array("cao",'-19751'), array("ce",'-19746'), array("ceng",'-19741'), array("cha",'-19739'), array("chai",'-19728'), array("chan",'-19725'), array("chang",'-19715'), array("chao",'-19540'), array("che",'-19531'), array("chen",'-19525'), array("cheng",'-19515'), array("chi",'-19500'), array("chong",'-19484'), array("chou",'-19479'), array("chu",'-19467'), array("chuai",'-19289'), array("chuan",'-19288'), array("chuang",'-19281'), array("chui",'-19275'), array("chun",'-19270'), array("chuo",'-19263'), array("ci",'-19261'), array("cong",'-19249'), array("cou",'-19243'), array("cu",'-19242'), array("cuan",'-19238'), array("cui",'-19235'), array("cun",'-19227'), array("cuo",'-19224'), array("da",'-19218'), array("dai",'-19212'), array("dan",'-19038'), array("dang",'-19023'), array("dao",'-19018'), array("de",'-19006'), array("deng",'-19003'), array("di",'-18996'), array("dian",'-18977'), array("diao",'-18961'), array("die",'-18952'), array("ding",'-18783'), array("diu",'-18774'), array("dong",'-18773'), array("dou",'-18763'), array("du",'-18756'), array("duan",'-18741'), array("dui",'-18735'), array("dun",'-18731'), array("duo",'-18722'), array("e",'-18710'), array("en",'-18697'), array("er",'-18696'), array("fa",'-18526'), array("fan",'-18518'), array("fang",'-18501'), array("fei",'-18490'), array("fen",'-18478'), array("feng",'-18463'), array("fo",'-18448'), array("fou",'-18447'), array("fu",'-18446'), array("ga",'-18239'), array("gai",'-18237'), array("gan",'-18231'), array("gang",'-18220'), array("gao",'-18211'), array("ge",'-18201'), array("gei",'-18184'), array("gen",'-18183'), array("geng",'-18181'), array("gong",'-18012'), array("gou",'-17997'), array("gu",'-17988'), array("gua",'-17970'), array("guai",'-17964'), array("guan",'-17961'), array("guang",'-17950'), array("gui",'-17947'), array("gun",'-17931'), array("guo",'-17928'), array("ha",'-17922'), array("hai",'-17759'), array("han",'-17752'), array("hang",'-17733'), array("hao",'-17730'), array("he",'-17721'), array("hei",'-17703'), array("hen",'-17701'), array("heng",'-17697'), array("hong",'-17692'), array("hou",'-17683'), array("hu",'-17676'), array("hua",'-17496'), array("huai",'-17487'), array("huan",'-17482'), array("huang",'-17468'), array("hui",'-17454'), array("hun",'-17433'), array("huo",'-17427'), array("ji",'-17417'), array("jia",'-17202'), array("jian",'-17185'), array("jiang",'-16983'), array("jiao",'-16970'), array("jie",'-16942'), array("jin",'-16915'), array("jing",'-16733'), array("jiong",'-16708'), array("jiu",'-16706'), array("ju",'-16689'), array("juan",'-16664'), array("jue",'-16657'), array("jun",'-16647'), array("ka",'-16474'), array("kai",'-16470'), array("kan",'-16465'), array("kang",'-16459'), array("kao",'-16452'), array("ke",'-16448'), array("ken",'-16433'), array("keng",'-16429'), array("kong",'-16427'), array("kou",'-16423'), array("ku",'-16419'), array("kua",'-16412'), array("kuai",'-16407'), array("kuan",'-16403'), array("kuang",'-16401'), array("kui",'-16393'), array("kun",'-16220'), array("kuo",'-16216'), array("la",'-16212'), array("lai",'-16205'), array("lan",'-16202'), array("lang",'-16187'), array("lao",'-16180'), array("le",'-16171'), array("lei",'-16169'), array("leng",'-16158'), array("li",'-16155'), array("lia",'-15959'), array("lian",'-15958'), array("liang",'-15944'), array("liao",'-15933'), array("lie",'-15920'), array("lin",'-15915'), array("ling",'-15903'), array("liu",'-15889'), array("long",'-15878'), array("lou",'-15707'), array("lu",'-15701'), array("lv",'-15681'), array("luan",'-15667'), array("lue",'-15661'), array("lun",'-15659'), array("luo",'-15652'), array("ma",'-15640'), array("mai",'-15631'), array("man",'-15625'), array("mang",'-15454'), array("mao",'-15448'), array("me",'-15436'), array("mei",'-15435'), array("men",'-15419'), array("meng",'-15416'), array("mi",'-15408'), array("mian",'-15394'), array("miao",'-15385'), array("mie",'-15377'), array("min",'-15375'), array("ming",'-15369'), array("miu",'-15363'), array("mo",'-15362'), array("mou",'-15183'), array("mu",'-15180'), array("na",'-15165'), array("nai",'-15158'), array("nan",'-15153'), array("nang",'-15150'), array("nao",'-15149'), array("ne",'-15144'), array("nei",'-15143'), array("nen",'-15141'), array("neng",'-15140'), array("ni",'-15139'), array("nian",'-15128'), array("niang",'-15121'), array("niao",'-15119'), array("nie",'-15117'), array("nin",'-15110'), array("ning",'-15109'), array("niu",'-14941'), array("nong",'-14937'), array("nu",'-14933'), array("nv",'-14930'), array("nuan",'-14929'), array("nue",'-14928'), array("nuo",'-14926'), array("o",'-14922'), array("ou",'-14921'), array("pa",'-14914'), array("pai",'-14908'), array("pan",'-14902'), array("pang",'-14894'), array("pao",'-14889'), array("pei",'-14882'), array("pen",'-14873'), array("peng",'-14871'), array("pi",'-14857'), array("pian",'-14678'), array("piao",'-14674'), array("pie",'-14670'), array("pin",'-14668'), array("ping",'-14663'), array("po",'-14654'), array("pu",'-14645'), array("qi",'-14630'), array("qia",'-14594'), array("qian",'-14429'), array("qiang",'-14407'), array("qiao",'-14399'), array("qie",'-14384'), array("qin",'-14379'), array("qing",'-14368'), array("qiong",'-14355'), array("qiu",'-14353'), array("qu",'-14345'), array("quan",'-14170'), array("que",'-14159'), array("qun",'-14151'), array("ran",'-14149'), array("rang",'-14145'), array("rao",'-14140'), array("re",'-14137'), array("ren",'-14135'), array("reng",'-14125'), array("ri",'-14123'), array("rong",'-14122'), array("rou",'-14112'), array("ru",'-14109'), array("ruan",'-14099'), array("rui",'-14097'), array("run",'-14094'), array("ruo",'-14092'), array("sa",'-14090'), array("sai",'-14087'), array("san",'-14083'), array("sang",'-13917'), array("sao",'-13914'), array("se",'-13910'), array("sen",'-13907'), array("seng",'-13906'), array("sha",'-13905'), array("shai",'-13896'), array("shan",'-13894'), array("shang",'-13878'), array("shao",'-13870'), array("she",'-13859'), array("shen",'-13847'), array("sheng",'-13831'), array("shi",'-13658'), array("shou",'-13611'), array("shu",'-13601'), array("shua",'-13406'), array("shuai",'-13404'), array("shuan",'-13400'), array("shuang",'-13398'), array("shui",'-13395'), array("shun",'-13391'), array("shuo",'-13387'), array("si",'-13383'), array("song",'-13367'), array("sou",'-13359'), array("su",'-13356'), array("suan",'-13343'), array("sui",'-13340'), array("sun",'-13329'), array("suo",'-13326'), array("ta",'-13318'), array("tai",'-13147'), array("tan",'-13138'), array("tang",'-13120'), array("tao",'-13107'), array("te",'-13096'), array("teng",'-13095'), array("ti",'-13091'), array("tian",'-13076'), array("tiao",'-13068'), array("tie",'-13063'), array("ting",'-13060'), array("tong",'-12888'), array("tou",'-12875'), array("tu",'-12871'), array("tuan",'-12860'), array("tui",'-12858'), array("tun",'-12852'), array("tuo",'-12849'), array("wa",'-12838'), array("wai",'-12831'), array("wan",'-12829'), array("wang",'-12812'), array("wei",'-12802'), array("wen",'-12607'), array("weng",'-12597'), array("wo",'-12594'), array("wu",'-12585'), array("xi",'-12556'), array("xia",'-12359'), array("xian",'-12346'), array("xiang",'-12320'), array("xiao",'-12300'), array("xie",'-12120'), array("xin",'-12099'), array("xing",'-12089'), array("xiong",'-12074'), array("xiu",'-12067'), array("xu",'-12058'), array("xuan",'-12039'), array("xue",'-11867'), array("xun",'-11861'), array("ya",'-11847'), array("yan",'-11831'), array("yang",'-11798'), array("yao",'-11781'), array("ye",'-11604'), array("yi",'-11589'), array("yin",'-11536'), array("ying",'-11358'), array("yo",'-11340'), array("yong",'-11339'), array("you",'-11324'), array("yu",'-11303'), array("yuan",'-11097'), array("yue",'-11077'), array("yun",'-11067'), array("za",'-11055'), array("zai",'-11052'), array("zan",'-11045'), array("zang",'-11041'), array("zao",'-11038'), array("ze",'-11024'), array("zei",'-11020'), array("zen",'-11019'), array("zeng",'-11018'), array("zha",'-11014'), array("zhai",'-10838'), array("zhan",'-10832'), array("zhang",'-10815'), array("zhao",'-10800'), array("zhe",'-10790'), array("zhen",'-10780'), array("zheng",'-10764'), array("zhi",'-10587'), array("zhong",'-10544'), array("zhou",'-10533'), array("zhu",'-10519'), array("zhua",'-10331'), array("zhuai",'-10329'), array("zhuan",'-10328'), array("zhuang",'-10322'), array("zhui",'-10315'), array("zhun",'-10309'), array("zhuo",'-10307'), array("zi",'-10296'), array("zong",'-10281'), array("zou",'-10274'), array("zu",'-10270'), array("zuan",'-10262'), array("zui",'-10260'), array("zun",'-10256'), array("zuo",'-10254') ); //拼音转化函数 function PinYin($str){ $ret=""; for($i=0;$i<strlen($str);$i++){ $p=ord(substr($str,$i,1)); //查看ASCII码 if($p>160){ //如果是中文,再多截取一个字符 $q=ord(substr($str,++$i,1)); $p=$p*256+$q-65536; } $ret.=$this->convert($p); } return $ret; } //转化函数 function convert($num){ if($num>0&&$num<160){ //如果不是汉字,直接返回相对字符 return chr($num); }elseif($num<"-20319"||$num>"-10247"){ return ""; }else{ //汉字,查找对应拼音 for($i=count($this->_code)-1;$i>=0;$i--){ if($this->_code[$i][1]<=$num) break; } return substr($this->_code[$i][0],0,1); } } }
下面这个是用来测试代码的:
<?php include_once 'charset.class.php'; header('Content-type: text/html;charset=utf-8'); $charset=new charset(); foreach(array('武汉','中国','上海') as $val){ echo iconv('gbk','utf-8//IGNORE',strtoupper($charset->PinYin(mb_convert_encoding($val,'gbk','utf-8')))); echo '<br/>'; }
三、这是网上找到个一个方法,经过测试可以正常使用,但对一些生僻字或者特殊字符会有问题.
function getFirstCharter($str){ if(empty($str)){return '';} $fchar=ord($str{0}); if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{0}); $s1=iconv('UTF-8','gb2312',$str); $s2=iconv('gb2312','UTF-8',$s1); $s=$s2==$str?$s1:$str; $asc=ord($s{0})*256+ord($s{1})-65536; if($asc>=-20319&&$asc<=-20284) return 'A'; if($asc>=-20283&&$asc<=-19776) return 'B'; if($asc>=-19775&&$asc<=-19219) return 'C'; if($asc>=-19218&&$asc<=-18711) return 'D'; if($asc>=-18710&&$asc<=-18527) return 'E'; if($asc>=-18526&&$asc<=-18240) return 'F'; if($asc>=-18239&&$asc<=-17923) return 'G'; if($asc>=-17922&&$asc<=-17418) return 'H'; if($asc>=-17417&&$asc<=-16475) return 'J'; if($asc>=-16474&&$asc<=-16213) return 'K'; if($asc>=-16212&&$asc<=-15641) return 'L'; if($asc>=-15640&&$asc<=-15166) return 'M'; if($asc>=-15165&&$asc<=-14923) return 'N'; if($asc>=-14922&&$asc<=-14915) return 'O'; if($asc>=-14914&&$asc<=-14631) return 'P'; if($asc>=-14630&&$asc<=-14150) return 'Q'; if($asc>=-14149&&$asc<=-14091) return 'R'; if($asc>=-14090&&$asc<=-13319) return 'S'; if($asc>=-13318&&$asc<=-12839) return 'T'; if($asc>=-12838&&$asc<=-12557) return 'W'; if($asc>=-12556&&$asc<=-11848) return 'X'; if($asc>=-11847&&$asc<=-11056) return 'Y'; if($asc>=-11055&&$asc<=-10247) return 'Z'; return null; }
php获取中文拼音首字母类和函数分享
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@