php将汉字转换为拼音

在php开发中,经常会遇到根据汉字的首字母拼音排序的问题,该如何解决呢!利用我们php强大的类.

1.引入汉字转换成拼音类Pinyin.class.php

<?php


/**
 * 汉字转化为拼音类
 */
class Pinyin {


    /**
     * 汉字ASCII码库
     * @var array
     */
    protected $lib;


    /**
     * 构造函数
     * @return void
     */
    public function __construct() {
        
    }


    /**
     * 汉字转化并输出拼音
     * @param string $str 所要转化拼音的汉字
     * @param boolean $utf8  汉字编码是否为utf8
     * @return string
     */
    public function output($str, $utf8 = true) {
        //参数分析
        if (!$str) {
            return false;
        }


        //编码转换.
        $str = ($utf8 == true) ? $this->iconvStr('utf-8', 'gbk', $str) : $str;
        $num = strlen($str);


        $pinyin = '';
        for ($i = 0; $i < $num; $i++) {
            $temp = ord(substr($str, $i, 1));
            if ($temp > 160) {
                $temp2 = ord(substr($str, ++$i, 1));
                $temp = $temp * 256 + $temp2 - 65536;
            }
            $pinyin .= $this->num2str($temp);
        }


        //输出的拼音编码转换.
        return ($utf8 == true) ? $this->iconvStr('gbk', 'utf-8', $pinyin) : $pinyin;
    }


    /**
     * 将ASCII编码转化为字符串.
     * @param integer $num
     * @return string
     */
    protected function num2str($num) {


        if (!$this->lib) {
            $this->parse_lib();
        }


        if ($num > 0 && $num < 160) {


            return chr($num);
        } elseif ($num < -20319 || $num > -10247) {


            return '';
        } else {
            $total = sizeof($this->lib) - 1;
            for ($i = $total; $i >= 0; $i--) {
                if ($this->lib[$i][1] <= $num) {
                    break;
                }
            }


            return $this->lib[$i][0];
        }
    }


    /**
     * 返回汉字编码库
     * @return array
     */
    protected function parse_lib() {


        return $this->lib = array(
            array("a", -20319),
            array("ai", -20317),
            array("an", -20304),
            array("ang", -20295),
            array("ao", -20292),
            array("ba", -20283),
            array("bai", -20265),
            array("ban", -20257),
            array("bang", -20242),
            array("bao", -20230),
            array("bei", -20051),
            array("ben", -20036),
            array("beng", -20032),
            array("bi", -20026),
            array("bian", -20002),
            array("biao", -19990),
            array("bie", -19986),
            array("bin", -19982),
            array("bing", -19976),
            array("bo", -19805),
            array("bu", -19784),
            array("ca", -19775),
            array("cai", -19774),
            array("can", -19763),
            array("cang", -19756),
            array("cao", -19751),
            array("ce", -19746),
            array("ceng", -19741),
            array("cha", -19739),
            array("chai", -19728),
            array("chan", -19725),
            array("chang", -19715),
            array("chao", -19540),
            array("che", -19531),
            array("chen", -19525),
            array("cheng", -19515),
            array("chi", -19500),
            array("chong", -19484),
            array("chou", -19479),
            array("chu", -19467),

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值