Skip to content

Instantly share code, notes, and snippets.

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