文字生成拼音首字母

<?php
use Think\Controller;

class GetPinYin extends Controller {
    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',

        215249 => '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 ( 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)-1;

// 排除非一级汉字

        if ($code < $data[0] || $code > $data[23]) return -1;

        for (;;) {
            if ( $lower > $upper ){
                return $data[$lower-1];

            }

            $middle = (int) round(($lower + $upper) / 2);

            if ( !isset($data[$middle]) ) {
                return -1;

            }

            if ( $data[$middle] < $code ){
                $lower = (int)$middle + 1;

            }else if ( $data[$middle] == $code ) {
                return $data[$middle];

            }else{
                $upper = (int)$middle - 1;

            }

        }// end for

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 要在JS中生成中文首字母,可以使用Unicode编码来实现。首先,将中文字符转换为Unicode编码,然后使用已封装的Unicode字母分类来获取中文字符的首字母。同时,需要验证字符是否为中文字符,如果是中文字符,则进行分类,如果不是中文字符,则直接返回。还需要注意去除空格等细节。通过这种方法,可以生成文字符的首字母列表。\[3\] #### 引用[.reference_title] - *1* [js 根据汉字首字母排序(省份排序) 或 根据英文首字母排序——za排序 & az排序](https://blog.csdn.net/weixin_44867717/article/details/125618165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [js中文串转成首字母(html,小程序wxml)](https://blog.csdn.net/qq_45179408/article/details/127245194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [js中文转拼音首字母(js汉字转拼音首字母)](https://blog.csdn.net/yetaodiao/article/details/129580627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亢亢是个程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值