Created
May 4, 2012 15:06
-
-
Save xixilive/2595347 to your computer and use it in GitHub Desktop.
get Chinese Pinyin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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