Home > Backend Development > PHP Tutorial > Share a tool class for Chinese Pinyin initials produced by PHP, _PHP tutorial

Share a tool class for Chinese Pinyin initials produced by PHP, _PHP tutorial

WBOY
Release: 2016-07-13 10:11:49
Original
879 people have browsed it

Share a Chinese Pinyin initial letter tool class produced by PHP,

The code is very simple, there are not many BBs here, please read the comments. Friends who can’t understand the comments, please let PHP go! ! !

Copy code The code is as follows:

/**
* Chinese Pinyin Initial Tools
* Note: English string: returned unchanged (including numbers) eg .abc123 => abc123
* Chinese string: Return the first character of Pinyin eg. Test string => CSZFC
* Chinese-English mixed string: Returns the first character of Pinyin and English eg. IiIj => WIWJ
* eg.
* $py = new str2PY();
*
* $result = $py->getInitials('Jay Chou');
*
* //Get the initial letter
* $result = $py->getFirstString('abc'); //A
* $resutl = $py->getFirstString("Jay Chou"); //Z
*
*/
class str2py
{
    private $_pinyins = array(
=> 'A',
=> 'B',
=> 'C',
=> 'D',
=> 'E',
=> 'F',
=> 'G',
=> 'H',
=> 'J',
=> 'K',
=> 'L',
=> 'M',
=> 'N',
=> 'O',
=> 'P',
=> 'Q',
=> 'R',
=> 'S',
=> 'T',
=> 'W',
=> 'X',
=> 'Y',
=> 'Z',
    );
    private $_charset = null;
    /**
* Constructor, specify the required encoding default: utf-8
* Support utf-8, gb2312
*
* @param unknown_type $charset
​​*/
    public function __construct($charset = 'utf-8')
    {
        $this->_charset = $charset;
    }
    /**
* Chinese string 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;
    }
    /**
* The string is divided into arrays (Chinese characters or one character as unit)
*
* @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;
    }
    /**
* Determine whether the character is an ascii character
*
* @param string $char
* @return bool
​​*/
    private function _isAscii($char)
    {
        return ( ord(substr($char, 0, 1)) < 160 );
    }
    /**
* Determine whether the first 3 characters of the string are ascii characters
*
* @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;
    }
    /**
* Get the first pinyin character of Chinese string
*
* @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));
                         /* Get the first letters of Pinyin A--Z */
If (($i = $this->_search($code)) != -1)
                {
                      $result[] = $this->_pinyins[$i];
            }
}
          return strtoupper(implode('', $result));
}
/**
* 20140624 wangtianbao Get the initial letter
* @param string $str
* @return string
​​*/
Public function getFirstString($str)
{
                     //Convert Chinese to letters first           $new_string = $this->getInitials($str);
           if (empty($new_string))
           {
              return '';
}
        else
           {
                return strtoupper(substr($new_string, 0, 1));
}
}
Private function _getChar($ascii)
{
If ($ascii >= 48 && $ascii <= 57)
           {
                 return chr($ascii); /* Number */
}
          elseif ($ascii >= 65 && $ascii <= 90)
           {
                 return chr($ascii); }
          elseif ($ascii >= 97 && $ascii <= 122)
           {
               return chr($ascii - 32); /* a--z */
}
        else
           {
              return '-'; /* Others */
}
}
/**
* Find the pinyin characters (dichotomy) corresponding to the required Chinese character internal code (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;
            }
}
}
}

Getting the first letter of a Chinese character is a function that is needed in almost every project at present. The code recommended here is a relatively efficient code, which is also used in my project. If you find any problems, please feel free to contact us. Please leave a message and let’s make progress together

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/926362.htmlTechArticleShare a Chinese Pinyin initial letter tool class made by PHP. The code is very simple. There are not many BBs here. Everyone Read the comments. Friends who can’t understand the comments, please let PHP go! ! ! Copy code...
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template