代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!!
<br /><?php<br />/**<br />* 汉字拼音首字母工具类<br />* 注: 英文的字串:不变返回(包括数字) eg .abc123 => abc123<br />* 中文字符串:返回拼音首字符 eg. 测试字符串 => CSZFC<br />* 中英混合串: 返回拼音首字符和英文 eg. 我i我j => WIWJ<br />* eg.<br />* $py = new str2PY();<br />* <br />* $result = $py->getInitials('周杰伦');<br />*<br />* //获取首字母<br />* $result = $py->getFirstString('abc'); //A<br />* $resutl = $py->getFirstString("周杰伦"); //Z<br />*<br />*/<br />class str2py<br />{<br /> private $_pinyins = array(<br />=> 'A',<br />=> 'B',<br />=> 'C',<br />=> 'D',<br />=> 'E',<br />=> 'F',<br />=> 'G',<br />=> 'H',<br />=> 'J',<br />=> 'K',<br />=> 'L',<br />=> 'M',<br />=> 'N',<br />=> 'O',<br />=> 'P',<br />=> 'Q',<br />=> 'R',<br />=> 'S',<br />=> 'T',<br />=> 'W',<br />=> 'X',<br />=> 'Y',<br />=> 'Z',<br /> );<br /> private $_charset = null;<br /> /**<br /> * 构造函数, 指定需要的编码 default: utf-8<br /> * 支持utf-8, gb2312<br /> *<br /> * @param unknown_type $charset<br /> */<br /> public function __construct($charset = 'utf-8')<br /> {<br /> $this->_charset = $charset;<br /> }<br /> /**<br /> * 中文字符串 substr<br /> *<br /> * @param string $str<br /> * @param int $start<br /> * @param int $len<br /> * @return string<br /> */<br /> private function _msubstr($str, $start, $len)<br /> {<br /> $start = $start * 2;<br /> $len = $len * 2;<br /> $strlen = strlen($str);<br /> $result = '';<br /> for ($i = 0; $i < $strlen; $i++)<br /> {<br /> if ($i >= $start && $i < ($start + $len))<br /> {<br /> if (ord(substr($str, $i, 1)) > 129)<br /> {<br /> $result .= substr($str, $i, 2);<br /> }<br /> else<br /> <a>本2文来*源gao($daima.com搞@代@#码(网</a><strong>搞gaodaima代码</strong> {<br /> $result .= substr($str, $i, 1);<br /> }<br /> }<br /> if (ord(substr($str, $i, 1)) > 129)<br /> {<br /> $i++;<br /> }<br /> }<br /> return $result;<br /> }<br /> /**<br /> * 字符串切分为数组 (汉字或者一个字符为单位)<br /> *<br /> * @param string $str<br /> * @return array<br /> */<br /> private function _cutWord($str)<br /> {<br /> $words = array();<br /> while ($str != "")<br /> {<br /> if ($this->_isAscii($str))<br /> {/* 非中文 */<br /> $words[] = $str[0];<br /> $str = substr($str, strlen($str[0]));<br /> }<br /> else<br /> {<br /> $word = $this->_msubstr($str, 0, 1);<br /> $words[] = $word;<br /> $str = substr($str, strlen($word));<br /> }<br /> }<br /> return $words;<br /> }<br /> /**<br /> * 判断字符是否是ascii字符<br /> *<br /> * @param string $char<br /> * @return bool<br /> */<br /> private function _isAscii($char)<br /> {<br /> return ( ord(substr($char, 0, 1)) < 160 );<br /> }<br /> /**<br /> * 判断字符串前3个字符是否是ascii字符<br /> *<br /> * @param string $str<br /> * @return bool<br /> */<br /> private function _isAsciis($str)<br /> {<br /> $len = strlen($str) >= 3 ? 3 : 2;<br /> $chars = array();<br /> for ($i = 1; $i < $len - 1; $i++)<br /> {<br /> $chars[] = $this->_isAscii($str[$i]) ? 'yes' : 'no';<br /> }<br /> $result = array_count_values($chars);<br /> if (empty($result['no']))<br /> {<br /> return true;<br /> }<br /> return false;<br /> }<br /> /**<br /> * 获取中文字串的拼音首字符<br /> *<br /> * @param string $str<br /> * @return string<br /> */<br /> public function getInitials($str)<br /> {<br /> if (empty($str))<br /> return '';<br /> if ($this->_isAscii($str[0]) && $this->_isAsciis($str))<br /> {<br /> return $str;<br /> }<br /> $result = array();<br /> if ($this->_charset == 'utf-8')<br /> {<br /> $str = iconv('utf-8', 'gb2312', $str);<br /> }<br /> $words = $this->_cutWord($str);<br /> foreach ($words as $word)<br /> {<br /> if ($this->_isAscii($word))<br /> {/* 非中文 */<br /> $result[] = $word;<br /> continue;<br /> }<br /> $code = ord(substr($word, 0, 1)) * 1000 + ord(substr($word, 1, 1));<br /> /* 获取拼音首字母A--Z */<br /> if (($i = $this->_search($code)) != -1)<br /> {<br /> $result[] = $this->_pinyins[$i];<br /> }<br /> }<br /> return strtoupper(implode('', $result));<br /> }<br /> /**<br /> * 20140624 wangtianbao 获取首字母<br /> * @param string $str<br /> * @return string<br /> */<br /> public function getFirstString($str)<br /> {<br /> //先把中文转换成字母<br /> $new_string = $this->getInitials($str);<br /> if (empty($new_string))<br /> {<br /> return '';<br /> }<br /> else<br /> {<br /> return strtoupper(substr($new_string, 0, 1));<br /> }<br /> }<br /> private function _getChar($ascii)<br /> {<br /> if ($ascii >= 48 && $ascii <= 57)<br /> {<br /> return chr($ascii); /* 数字 */<br /> }<br /> elseif ($ascii >= 65 && $ascii <= 90)<br /> {<br /> return chr($ascii); /* A--Z */<br /> }<br /> elseif ($ascii >= 97 && $ascii <= 122)<br /> {<br /> return chr($ascii - 32); /* a--z */<br /> }<br /> else<br /> {<br /> return '-'; /* 其他 */<br /> }<br /> }<br /> /**<br /> * 查找需要的汉字内码(gb2312) 对应的拼音字符( 二分法 )<br /> *<br /> * @param int $code<br /> * @return int<br /> */<br /> private function _search($code)<br /> {<br /> $data = array_keys($this->_pinyins);<br /> $lower = 0;<br /> $upper = sizeof($data) - 1;<br /> $middle = (int) round(($lower + $upper) / 2);<br /> if ($code < $data[0])<br /> return -1;<br /> for (;;)<br /> {<br /> if ($lower > $upper)<br /> {<br /> return $data[$lower - 1];<br /> }<br /> $tmp = (int) round(($lower + $upper) / 2);<br /> if (!isset($data[$tmp]))<br /> {<br /> return $data[$middle];<br /> }<br /> else<br /> {<br /> $middle = $tmp;<br /> }<br /> if ($data[$middle] < $code)<br /> {<br /> $lower = (int) $middle + 1;<br /> }<br /> else if ($data[$middle] == $code)<br /> {<br /> return $data[$middle];<br /> }<br /> else<br /> {<br /> $upper = (int) $middle - 1;<br /> }<br /> }<br /> }<br />}<br />
取汉字首字母算是目前几乎没个项目中都需要用到的功能了,这里给大家推荐的是效率比较高的代码,也是在本人项目中使用的,小伙伴们如发现问题,还请留言,大家共同进步