php程序的时候经常要用到中文转换拼音,网上也有不少程序,写的都不怎么规范,笔者将它整理成一个类,这样,需要使用的朋友直接调用这个类就可以了。需要注意的是,这个代码是针对GB编码的。

使用方法:

<?php
$py= new PinYin();
var_dump($py->getFullSpell($_GET['q']));
?>
<?php

/**
 * PinYin 汉字转换拼音类
 *
 * @copyright Copyright (c) 2010 cnphp.info
 * @author freemouse
 * @package root
 * @version v0.1
 */

/**
 * GB2PY 汉字转换拼音类
 * @package Util
 */
class PinYin {

    /**
     * @var array $codeList 拼音编码对应表
     * @access private
     */
    private $codeList = array(
                'a'=>-20319,
                'ai'=>-20317,
                'an'=>-20304,
                'ang'=>-20295,
                'ao'=>-20292,
                'ba'=>-20283,
                'bai'=>-20265,
                'ban'=>-20257,
                'bang'=>-20242,
                'bao'=>-20230,
                'bei'=>-20051,
                'ben'=>-20036,
                'beng'=>-20032,
                'bi'=>-20026,
                'bian'=>-20002,
                'biao'=>-19990,
                'bie'=>-19986,
                'bin'=>-19982,
                'bing'=>-19976,
                'bo'=>-19805,
                'bu'=>-19784,
                'ca'=>-19775,
                'cai'=>-19774,
                'can'=>-19763,
                'cang'=>-19756,
                'cao'=>-19751,
                'ce'=>-19746,
                'ceng'=>-19741,
                'cha'=>-19739,
                'chai'=>-19728,
                'chan'=>-19725,
                'chang'=>-19715,
                'chao'=>-19540,
                'che'=>-19531,
                'chen'=>-19525,
                'cheng'=>-19515,
                'chi'=>-19500,
                'chong'=>-19484,
                'chou'=>-19479,
                'chu'=>-19467,
                'chuai'=>-19289,
                'chuan'=>-19288,
                'chuang'=>-19281,
                'chui'=>-19275,
                'chun'=>-19270,
                'chuo'=>-19263,
                'ci'=>-19261,
                'cong'=>-19249,
                'cou'=>-19243,
                'cu'=>-19242,
                'cuan'=>-19238,
                'cui'=>-19235,
                'cun'=>-19227,
                'cuo'=>-19224,
                'da'=>-19218,
                'dai'=>-19212,
                'dan'=>-19038,
                'dang'=>-19023,
                'dao'=>-19018,
                'de'=>-19006,
                'deng'=>-19003,
                'di'=>-18996,
                'dian'=>-18977,
                'diao'=>-18961,
                'die'=>-18952,
                'ding'=>-18783,
                'diu'=>-18774,
                'dong'=>-18773,
                'dou'=>-18763,
                'du'=>-18756,
                'duan'=>-18741,
                'dui'=>-18735,
                'dun'=>-18731,
                'duo'=>-18722,
                'e'=>-18710,
                'en'=>-18697,
                'er'=>-18696,
                'fa'=>-18526,
                'fan'=>-18518,
                'fang'=>-18501,
                'fei'=>-18490,
                'fen'=>-18478,
                'feng'=>-18463,
                'fo'=>-18448,
                'fou'=>-18447,
                'fu'=>-18446,
                'ga'=>-18239,
                'gai'=>-18237,
                'gan'=>-18231,
                'gang'=>-18220,
                'gao'=>-18211,
                'ge'=>-18201,
                'gei'=>-18184,
                'gen'=>-18183,
                'geng'=>-18181,
                'gong'=>-18012,
                'gou'=>-17997,
                'gu'=>-17988,
                'gua'=>-17970,
                'guai'=>-17964,
                'guan'=>-17961,
                'guang'=>-17950,
                'gui'=>-17947,
                'gun'=>-17931,
                'guo'=>-17928,
                'ha'=>-17922,
                'hai'=>-17759,
                'han'=>-17752,
                'hang'=>-17733,
                'hao'=>-17730,
                'he'=>-17721,
                'hei'=>-17703,
                'hen'=>-17701,
                'heng'=>-17697,
                'hong'=>-17692,
                'hou'=>-17683,
                'hu'=>-17676,
                'hua'=>-17496,
                'huai'=>-17487,
                'huan'=>-17482,
                'huang'=>-17468,
                'hui'=>-17454,
                'hun'=>-17433,
                'huo'=>-17427,
                'ji'=>-17417,
                'jia'=>-17202,
                'jian'=>-17185,
                'jiang'=>-16983,
                'jiao'=>-16970,
                'jie'=>-16942,
                'jin'=>-16915,
                'jing'=>-16733,
                'jiong'=>-16708,
                'jiu'=>-16706,
                'ju'=>-16689,
                'juan'=>-16664,
                'jue'=>-16657,
                'jun'=>-16647,
                'ka'=>-16474,
                'kai'=>-16470,
                'kan'=>-16465,
                'kang'=>-16459,
                'kao'=>-16452,
                'ke'=>-16448,
                'ken'=>-16433,
                'keng'=>-16429,
                'kong'=>-16427,
                'kou'=>-16423,
                'ku'=>-16419,
                'kua'=>-16412,
                'kuai'=>-16407,
                'kuan'=>-16403,
                'kuang'=>-16401,
                'kui'=>-16393,
                'kun'=>-16220,
                'kuo'=>-16216,
                'la'=>-16212,
                'lai'=>-16205,
                'lan'=>-16202,
                'lang'=>-16187,
                'lao'=>-16180,
                'le'=>-16171,
                'lei'=>-16169,
                'leng'=>-16158,
                'li'=>-16155,
                'lia'=>-15959,
                'lian'=>-15958,
                'liang'=>-15944,
                'liao'=>-15933,
                'lie'=>-15920,
                'lin'=>-15915,
                'ling'=>-15903,
                'liu'=>-15889,
                'long'=>-15878,
                'lou'=>-15707,
                'lu'=>-15701,
                'lv'=>-15681,
                'luan'=>-15667,
                'lue'=>-15661,
                'lun'=>-15659,
                'luo'=>-15652,
                'ma'=>-15640,
                'mai'=>-15631,
                'man'=>-15625,
                'mang'=>-15454,
                'mao'=>-15448,
                'me'=>-15436,
                'mei'=>-15435,
                'men'=>-15419,
                'meng'=>-15416,
                'mi'=>-15408,
                'mian'=>-15394,
                'miao'=>-15385,
                'mie'=>-15377,
                'min'=>-15375,
                'ming'=>-15369,
                'miu'=>-15363,
                'mo'=>-15362,
                'mou'=>-15183,
                'mu'=>-15180,
                'na'=>-15165,
                'nai'=>-15158,
                'nan'=>-15153,
                'nang'=>-15150,
                'nao'=>-15149,
                'ne'=>-15144,
                'nei'=>-15143,
                'nen'=>-15141,
                'neng'=>-15140,
                'ni'=>-15139,
                'nian'=>-15128,
                'niang'=>-15121,
                'niao'=>-15119,
                'nie'=>-15117,
                'nin'=>-15110,
                'ning'=>-15109,
                'niu'=>-14941,
                'nong'=>-14937,
                'nu'=>-14933,
                'nv'=>-14930,
                'nuan'=>-14929,
                'nue'=>-14928,
                'nuo'=>-14926,
                'o'=>-14922,
                'ou'=>-14921,
                'pa'=>-14914,
                'pai'=>-14908,
                'pan'=>-14902,
                'pang'=>-14894,
                'pao'=>-14889,
                'pei'=>-14882,
                'pen'=>-14873,
                'peng'=>-14871,
                'pi'=>-14857,
                'pian'=>-14678,
                'piao'=>-14674,
                'pie'=>-14670,
                'pin'=>-14668,
                'ping'=>-14663,
                'po'=>-14654,
                'pu'=>-14645,
                'qi'=>-14630,
                'qia'=>-14594,
                'qian'=>-14429,
                'qiang'=>-14407,
                'qiao'=>-14399,
                'qie'=>-14384,
                'qin'=>-14379,
                'qing'=>-14368,
                'qiong'=>-14355,
                'qiu'=>-14353,
                'qu'=>-14345,
                'quan'=>-14170,
                'que'=>-14159,
                'qun'=>-14151,
                'ran'=>-14149,
                'rang'=>-14145,
                'rao'=>-14140,
                're'=>-14137,
                'ren'=>-14135,
                'reng'=>-14125,
                'ri'=>-14123,
                'rong'=>-14122,
                'rou'=>-14112,
                'ru'=>-14109,
                'ruan'=>-14099,
                'rui'=>-14097,
                'run'=>-14094,
                'ruo'=>-14092,
                'sa'=>-14090,
                'sai'=>-14087,
                'san'=>-14083,
                'sang'=>-13917,
                'sao'=>-13914,
                'se'=>-13910,
                'sen'=>-13907,
                'seng'=>-13906,
                'sha'=>-13905,
                'shai'=>-13896,
                'shan'=>-13894,
                'shang'=>-13878,
                'shao'=>-13870,
                'she'=>-13859,
                'shen'=>-13847,
                'sheng'=>-13831,
                'shi'=>-13658,
                'shou'=>-13611,
                'shu'=>-13601,
                'shua'=>-13406,
                'shuai'=>-13404,
                'shuan'=>-13400,
                'shuang'=>-13398,
                'shui'=>-13395,
                'shun'=>-13391,
                'shuo'=>-13387,
                'si'=>-13383,
                'song'=>-13367,
                'sou'=>-13359,
                'su'=>-13356,
                'suan'=>-13343,
                'sui'=>-13340,
                'sun'=>-13329,
                'suo'=>-13326,
                'ta'=>-13318,
                'tai'=>-13147,
                'tan'=>-13138,
                'tang'=>-13120,
                'tao'=>-13107,
                'te'=>-13096,
                'teng'=>-13095,
                'ti'=>-13091,
                'tian'=>-13076,
                'tiao'=>-13068,
                'tie'=>-13063,
                'ting'=>-13060,
                'tong'=>-12888,
                'tou'=>-12875,
                'tu'=>-12871,
                'tuan'=>-12860,
                'tui'=>-12858,
                'tun'=>-12852,
                'tuo'=>-12849,
                'wa'=>-12838,
                'wai'=>-12831,
                'wan'=>-12829,
                'wang'=>-12812,
                'wei'=>-12802,
                'wen'=>-12607,
                'weng'=>-12597,
                'wo'=>-12594,
                'wu'=>-12585,
                'xi'=>-12556,
                'xia'=>-12359,
                'xian'=>-12346,
                'xiang'=>-12320,
                'xiao'=>-12300,
                'xie'=>-12120,
                'xin'=>-12099,
                'xing'=>-12089,
                'xiong'=>-12074,
                'xiu'=>-12067,
                'xu'=>-12058,
                'xuan'=>-12039,
                'xue'=>-11867,
                'xun'=>-11861,
                'ya'=>-11847,
                'yan'=>-11831,
                'yang'=>-11798,
                'yao'=>-11781,
                'ye'=>-11604,
                'yi'=>-11589,
                'yin'=>-11536,
                'ying'=>-11358,
                'yo'=>-11340,
                'yong'=>-11339,
                'you'=>-11324,
                'yu'=>-11303,
                'yuan'=>-11097,
                'yue'=>-11077,
                'yun'=>-11067,
                'za'=>-11055,
                'zai'=>-11052,
                'zan'=>-11045,
                'zang'=>-11041,
                'zao'=>-11038,
                'ze'=>-11024,
                'zei'=>-11020,
                'zen'=>-11019,
                'zeng'=>-11018,
                'zha'=>-11014,
                'zhai'=>-10838,
                'zhan'=>-10832,
                'zhang'=>-10815,
                'zhao'=>-10800,
                'zhe'=>-10790,
                'zhen'=>-10780,
                'zheng'=>-10764,
                'zhi'=>-10587,
                'zhong'=>-10544,
                'zhou'=>-10533,
                'zhu'=>-10519,
                'zhua'=>-10331,
                'zhuai'=>-10329,
                'zhuan'=>-10328,
                'zhuang'=>-10322,
                'zhui'=>-10315,
                'zhun'=>-10309,
                'zhuo'=>-10307,
                'zi'=>-10296,
                'zong'=>-10281,
                'zou'=>-10274,
                'zu'=>-10270,
                'zuan'=>-10262,
                'zui'=>-10260,
                'zun'=>-10256,
                'zuo'=>-10254
                );

    /**
     * 取汉字所有拼音
     * @param string $chinese 要转换的汉字
     * @param string $delimiter 分隔符
     * @param int $length 返回的长度
     * @return string
     */
    public function getFullSpell($chinese, $delimiter = ' ', $length = 0) {
        $spell = $this->getChineseSpells($chinese, $delimiter);
        if ($length) {
            $spell = substr($spell, 0, $length);
        }
        return $spell;
    }

    /**
     * 取汉字第一个拼音
     * @param string $chinese 要转换的汉字
     * @param int $length 返回的长度
     * @return string
     */
    public function getFirstSpell($chinese, $length = 0) {
        $spell = $this->getChineseSpells($chinese, ' ', 1);
        if ($length) {
            $spell = substr($spell, 0, $length);
        }
        return $spell;
    }

    /**
     * 取一个汉字码对应的拼音
     * @param int $num 汉字码
     * @param string $blank 空白字符
     * @return string
     */
    private function getChineseSpell ($num,    $blank = '') {
        if ( $num>0 && $num<160 ) {
            return chr($num);
        } elseif ($num<-20319||$num>-10247) {
            return $blank;
        } else {
            foreach ($this->codeList as $spell => $code) {
                if ($code > $num) break;
                $result = $spell;
            }
            return $result;
        }
    }

    /**
     * 取汉字拼音
     * @param string $chinese 要转换的汉字
     * @param string $delimiter 分隔符
     * @param int $first 是否只返回第一个
     * @return string
     */
    private function getChineseSpells($chinese, $delimiter = ' ', $first=0)
    {
        $result = array();
        for ($i=0; $i160)    {
                $q = ord(substr($chinese,++$i,1));
                $p = $p*256 + $q - 65536;
            }
            $result[] = $this->getChineseSpell($p);
            if ($first) {
                return $result[0];
            }
        }
        return implode($delimiter, $result);
    }
}
?>