首页 > php开发 > php实现获取汉字的首字母两个实例

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

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

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

<?php
/** 
 * 修复二分法查找方法
 * 汉字拼音首字母工具类
 *  注: 英文的字串:不变返回(包括数字)    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 < $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;
    }
    /** 
     * 字符串切分为数组 (汉字或者一个字符为单位)
     *
     * @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)) < 160);
    }
    /** 
     * 判断字符串前3个字符是否是ascii字符
     *
     * @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 (emptyempty($result['no'])) {
            return true;
        }
        return false;
    }
    /** 
     * 获取中文字串的拼音首字符
     *
     * @param string $str
     * @return string
     */
    public function getInitials($str) {
        if (emptyempty($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 <= 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 '-'; /*其他*/
        }
    }
    /** 
     * 查找需要的汉字内码(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 < $data[0]) return -1;
        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] < $code) {
                $lower = (int)$middle + 1;
            } else if ($data[$middle] == $code) {
                return $data[$middle];
            } else {
                $upper = (int)$middle - 1;
            }
        }
    }
}
?>

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

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  

<?php
function getfirstchar($s0) {
    $fchar = ord($s0{0});
    if ($fchar >= ord("A") and $fchar <= ord("z")) return strtoupper($s0{0});
    $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 <= - 20284) return "A";
    if ($asc >= - 20283 and $asc <= - 19776) return "B";
    if ($asc >= - 19775 and $asc <= - 19219) return "C";
    if ($asc >= - 19218 and $asc <= - 18711) return "D";
    if ($asc >= - 18710 and $asc <= - 18527) return "E";
    if ($asc >= - 18526 and $asc <= - 18240) return "F";
    if ($asc >= - 18239 and $asc <= - 17923) return "G";
    if ($asc >= - 17922 and $asc <= - 17418) return "I";
    if ($asc >= - 17417 and $asc <= - 16475) return "J";
    if ($asc >= - 16474 and $asc <= - 16213) return "K";
    if ($asc >= - 16212 and $asc <= - 15641) return "L";
    if ($asc >= - 15640 and $asc <= - 15166) return "M";
    if ($asc >= - 15165 and $asc <= - 14923) return "N";
    if ($asc >= - 14922 and $asc <= - 14915) return "O";
    if ($asc >= - 14914 and $asc <= - 14631) return "P";
    if ($asc >= - 14630 and $asc <= - 14150) return "Q";
    if ($asc >= - 14149 and $asc <= - 14091) return "R";
    if ($asc >= - 14090 and $asc <= - 13319) return "S";
    if ($asc >= - 13318 and $asc <= - 12839) return "T";
    if ($asc >= - 12838 and $asc <= - 12557) return "W";
    if ($asc >= - 12556 and $asc <= - 11848) return "X";
    if ($asc >= - 11847 and $asc <= - 11056) return "Y";
    if ($asc >= - 11055 and $asc <= - 10247) return "Z";
    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 < strlen($zh); $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 "这是中文字符串<br/>";
echo pinyin1('这是中文字符串');
?>


本文地址:http://www.phprm.com/develop/fs3733.html

转载随意,但请附上文章地址:-)

标签:php首字母实例

发表留言