php 字符串拼音首字母(支持数字,英文,常用汉字)

方法一

function getinitial($str)

{

     $asc=ord(substr($str,0,1));

     if ($asc<160) //非中文

     {

         if ($asc>=48 && $asc<=57){

             return chr($asc); //数字

         }elseif ($asc>=65 && $asc<=90){

             return chr($asc);    // A--Z

         }elseif ($asc>=97 && $asc<=122){

             return chr($asc-32); // a--z

         }else{

             return '~'; //其他

         }

     }

     else    //中文

     {

         $asc=$asc*1000+ord(substr($str,1,1));

         //获取拼音首字母A--Z

         if ($asc>=176161 && $asc<176197){

             return 'A';

         }elseif ($asc>=176197 && $asc<178193){

             return 'B';

         }elseif ($asc>=178193 && $asc<180238){

             return 'C';

         }elseif ($asc>=180238 && $asc<182234){

             return 'D';

         }elseif ($asc>=182234 && $asc<183162){

             return 'E';

         }elseif ($asc>=183162 && $asc<184193){

             return 'F';

         }elseif ($asc>=184193 && $asc<185254){

             return 'G';

         }elseif ($asc>=185254 && $asc<187247){

             return 'H';

         }elseif ($asc>=187247 && $asc<191166){

             return 'J';

         }elseif ($asc>=191166 && $asc<192172){

             return 'K';

         }elseif ($asc>=192172 && $asc<194232){

             return 'L';

         }elseif ($asc>=194232 && $asc<196195){

             return 'M';

       }elseif ($asc>=196195 && $asc<197182){

             return 'N';

         }elseif ($asc>=197182 && $asc<197190){

             return 'O';

         }elseif ($asc>=197190 && $asc<198218){

             return 'P';

         }elseif ($asc>=198218 && $asc<200187){

             return 'Q';

         }elseif ($asc>=200187 && $asc<200246){

             return 'R';

         }elseif ($asc>=200246 && $asc<203250){

             return 'S';

         }elseif ($asc>=203250 && $asc<205218){

             return 'T';

         }elseif ($asc>=205218 && $asc<206244){

             return 'W';

         }elseif ($asc>=206244 && $asc<209185){

             return 'X';

         }elseif ($asc>=209185 && $asc<212209){

             return 'Y';

         }elseif ($asc>=212209){

             return 'Z';

         }else{

             return '~';

         }

     }

}

 

 

 

方法二

<?php
/**
 * created by wangbinandi@gmail.com at 2008-12-29 21:12
 * 汉字拼音首字母工具类
 *  注: 英文的字串:不变返回(包括数字)    eg .abc123 => abc123
 *      中文字符串:返回拼音首字符        eg. 王小明 => WXM
 *      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ
 *  eg.
 *  $py = new PYInitials();
 *  $result = $py->getInitials('王小明');
 */
class PYInitials
{
    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, $i, 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 ( 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 <= 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);
        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;
            }
        }// end for
    }
}
?>

 

 

方法三

$letters=array(
'A'=>0xB0C4,
'B'=>0xB2C0,
'C'=>0xB4ED,
'D'=>0xB6E9,
'E'=>0xB7A1,
'F'=>0xB8C0,
'G'=>0xB9FD,
'H'=>0xBBF6,
'J'=>0xBFA5,
'K'=>0xC0AB,
'L'=>0xC2E7,
'M'=>0xC4C2,
'N'=>0xC5B5,
'O'=>0xC5BD,
'P'=>0xC6D9,
'Q'=>0xC8BA,
'R'=>0xC8F5,
'S'=>0xCBF9,
'T'=>0xCDD9,
'W'=>0xCEF3,
'X'=>0xD188,
'Y'=>0xD4D0,
'Z'=>0xD7F9,
);

function getLetter($input)
{
    global $letters;
    $input = iconv('UTF-8', 'GB18030', $input);

    $str = substr($input, 0, 1);
    if ($str >= chr(0x81) && $str <= chr(0xfe))    {
        $num = hexdec(bin2hex(substr($input, 0, 2)));
        foreach ($letters as $k=>$v){
            if($v>=$num)
            break;
        }
        return $k;
    }
    else{
        return $str;
    }
}

exit(getLetter('雪'));

 

 

 

方法四

function getfirstchar($s0){
$firstchar_ord=ord(strtoupper($s0{0}));
if (($firstchar_ord>=65 and $firstchar_ord<=91)or($firstchar_ord>=48 and $firstchar_ord<=57)) return $s0{0};
$s=iconv("UTF-8","gb2312", $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 "H";
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;
}
echo getfirstchar("哈哈");

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值