跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

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

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

例1主要功能是:功能明确,易于修改维护和扩展; 英文的字串:不变返回(包括数字);中文字符串:返回拼音首字符; 中英混合串: 返回拼音首字符和英文。该算法采用了二分法查找,修复了之前字母Z读取成Y的错误。好东西要收藏,故在此留下印记,以供后人考证!

代码如下复制代码/*** 修复二分法查找方法* 汉字拼音首字母工具类*  注: 英文的字串:不变返回(包括数字)    eg .abc123 => abc123*      中文字符串:返回拼音首字符        eg. 测试字符串 => CSZFC*      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ*  eg.*  $py = new str2PY();*  $result = $py->getInitials('啊吧才的饿飞就好i就看了吗你哦平去人是他uv我想一在');*/class str2PY{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',);private $_charset = null;/*** 构造函数, 指定需要的编码 default: utf-8* 支持utf-8, gb2312** @param unknown_type $charset*/public function __construct( $charset = 'utf-8' ){$this->_charset    = $charset;}/*** 中文字符串 substr** @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 if ( $i >= $start && $i 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;}/*** 字符串切分为数组 (汉字或者一个字符为单位)** @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;}/*** 判断字符是否是ascii字符** @param string $char* @return bool*/private function _isAscii( $char ){return ( ord( substr($char,0,1) )}/*** 判断字符串前3个字符是否是ascii字符** @param string $str* @return bool*/private function _isAsciis( $str ){$len = strlen($str) >= 3 ? 3: 2;$chars = array();for( $i = 1; $i$chars[] = $this->_isAscii( $str[$i] ) ? 'yes':'no';}$result = array_count_values( $chars );if ( empty($result['no']) ){return true;}return false;}/*** 获取中文字串的拼音首字符** @param string $str* @return string*/public function getInitials( $str ){if ( empty($str) ) return '';if ( $this->_isAscii($str[0]) && $this->_isAsciis( $str )){return $str;}$result = array();if ( $this->_charset == 'utf-8' ){$str = iconv( 'utf-8', 'gb2312', $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));}private function _getChar( $ascii ){if ( $ascii >= 48 && $ascii return chr($ascii);  /*数字*/}elseif ( $ascii>=65 && $ascii return chr($ascii);   /* A--Z*/}elseif ($ascii>=97 && $ascii return chr($ascii-32); /* a--z*/}else{return '-'; /*其他*/}}/*** 查找需要的汉字内码(gb2312) 对应的拼音字符( 二分法 )** @param int $code* @return int*/private function _search( $code ){$data = array_keys($this->_pinyins);$lower = 0;$upper = sizeof($data)-1;$middle = (int) round(($lower + $upper) / 2);if ( $code for (;;) {if ( $lower > $upper ){return $data[$lower-1];}$tmp = (int) round(($lower + $upper) / 2);if ( !isset($data[$tmp]) ){return $data[$middle];}else{$middle = $tmp;}if ( $data[$middle]$lower = (int)$middle + 1;}else if ( $data[$middle] == $code ) {return $data[$middle];}else{$upper = (int)$middle - 1;}}}}?>例2取汉字的asc区间然后返回汉字首字母了。

立即学习“PHP免费学习笔记(深入)

”;

代码如下复制代码function getfirstchar($s0){$fchar = ord($s0{0});if($fchar >= ord("A") and $fchar$s1 = iconv("UTF-8","gb2312", $s0);$s2 = iconv("gb2312","UTF-8", $s1);if($s2 == $s0){$s = $s1;}else{$s = $s0;}$asc = ord($s{0}) * 256 + ord($s{1}) - 65536;if($asc >= -20319 and $asc if($asc >= -20283 and $asc if($asc >= -19775 and $asc if($asc >= -19218 and $asc if($asc >= -18710 and $asc if($asc >= -18526 and $asc if($asc >= -18239 and $asc if($asc >= -17922 and $asc if($asc >= -17417 and $asc if($asc >= -16474 and $asc if($asc >= -16212 and $asc if($asc >= -15640 and $asc if($asc >= -15165 and $asc if($asc >= -14922 and $asc if($asc >= -14914 and $asc if($asc >= -14630 and $asc if($asc >= -14149 and $asc if($asc >= -14090 and $asc if($asc >= -13318 and $asc if($asc >= -12838 and $asc if($asc >= -12556 and $asc if($asc >= -11847 and $asc if($asc >= -11055 and $asc return null;}function pinyin1($zh){$ret = "";$s1 = iconv("UTF-8","gb2312", $zh);$s2 = iconv("gb2312","UTF-8", $s1);if($s2 == $zh){$zh = $s1;}for($i = 0; $i$s1 = substr($zh,$i,1);$p = ord($s1);if($p > 160){$s2 = substr($zh,$i++,2);$ret .= getfirstchar($s2);}else{$ret .= $s1;}}return $ret;}echo "这是中文字符串";echo pinyin1('这是中文字符串');?>

相关文章