PHP实现中文转拼音的原生方法与代码详解

白榆
白榆
发布时间:2026-10-14 | 3人浏览过
原创

PHP 原生环境默认不包含中文转拼音扩展。本文整理并优化了两种常用实现思路:基于全量 Unicode 字库的 UTF-8 直接映射法,以及利用 GBK 编码边界进行区间检索的快速查表类。文章附带精简后的完整代码与参数配置说明,便于开发者直接在项目中集成拼音转换功能。

效果预览

以下为输入中文字符串后的典型转换输出效果:

方案一:基于全量字库的 UTF-8 映射

该方案维护了一个包含数万汉字的静态哈希表。运行时逐字节读取 UTF-8 字符串,若命中字库则输出对应拼音,未匹配的字符则使用指定的占位符替代。此方法兼容性较好,支持自定义允许的非中文字符正则与输出格式。

<?php
/**
 * PHP 汉字转拼音函数 [支持首字母/全拼模式]
 * 注意:请确保已开启 mb_string 扩展
 */
function pinyin($str, $ret_format = 'all', $placeholder = '_', $allow_chars = '/[a-zA-Z\d ]/') {
    static $pinyins = null;
    if (null === $pinyins) {
        // 加载庞大的汉字到拼音映射数据
        $data = 'yi:一,乙,亿,以,仪,伿,佾,依,倚,儀,億,医,呓,咦,咿,唈,噫,囈,圛,圯,夷,奕,姨,宜,屹,峄,已,巸,异,弈,彛,彝,役,忆,怡,怿,意,懿,抑,易,杙,楑,椅,欫,欺,氣,汽,泣,渏,漆,炁,琦,畦,砐,砌,祁,祈,祺,笖,籏,粸,紪,綦,繄,繶,绎,義,羿,翊,翌,耴,胰,艺,苅,萓,藙,藝,蘙,虉,蚁,蜴,蟻,衣,裔,裛,觺,訳,詣,誃,譩,譯,议,译,诒,诣,谊,豙,跇,軼,轶,辷,迆,逸,遗,邑,酏,醫,釔,鉯,銥,钇,铱,镒,阣,頤,颐,飴,饐,驛,骮,鮧,鯣,鳦,鶃,鷁,鵿,鸃,鹢,黓|ding:丁,仃,叮,奵,定,嵿,忊,椗,玎,甼,盯,碇,耵,腚,萣,薡,訂,订,酊,釘,錠,鐤,钉,锭,頂,顁,顶,飣,馐,鼎|kao:丂,尻,拷,栲,烤,犒,考,銬,铐,靠,髛,鮳,鲓,䐧|qi:七,乞,亓,企,僛,其,凄,启,呇,唘,啓,啔,啟,嘁,器,圻,埼,奇,契,妻,婍,屺,岂,岐,岓,崎,嵜,帺,弃,忯,凄,愒,憇,憩,戚,掑,斉,斊,旗,晵,朞,期,杞,桤,棄,棋,棨,棲,榿,檱,櫀,欫,欺,歧,气,気,氣,汔,汽,沏,泣,淇,淒,湆,漆,瀬,炁,狋,玂,琦,璂,甈,畦,疧,盀,矵,砌,碁,磎,磜,礊,祁,祇,祈,祺,禥,竒,笖,簱,粸,紪,綦,繄,繶,绎,羛,義,羿,翊,翌,翳,耴,肊,胰,艗,艺,苅,萓,藙,藝,蘙,虉,蚁,蛜,蜴,螘,蟻,衣,衤,裔,裛,觺,訲,訳,詍,詣,誃,謻,譩,譯,議,议,译,诒,诣,谊,豙,跇,軼,轶,辷,迆,逸,遗,邑,酏,醫,醳,釔,鉯,銥,鎰,鏔,钇,铱,镒,阣,隿,頤,颐,飴,饐,驛,驿,骮,鮧,鯣,鳦,鶃,鷁,鵿,鸃,鹢,黓,㐹|shang:丄,上,仩,伤,傷,商,垧,墒,尙,尚,恦,愓,慯,扄,晌,殇,殤,滳,漡,熵,緔,绱,蔏,螪,裳,觞,觴,謪,賞,赏,鑜,鬺,䬕|xia:丅,下,侠,俠,匣,厦,吓,呷,嚇,圷,夏,峽,廈,搳,暇,柙,溊,烚,煆,狎,狭,珨,瑕,疜,瞎,硖,磍,笚,縀,罅,翈,舝,蕸,虾,諕,谺,轄,辖,遐,鍜,鎋,閕,陜,霞,颬,騢,魻,鰕,鶷,黠|mu:丆,亩,仫,墓,姆,娒,幕,幙,慕,拇,旀,木,椧,母,毣,沐,炑,牡,牧,牳,狇,獏,畝,目,睦,穆,胟,苜,莯,萺,蚞,踇,鉧,钼,雮,霂|wan:万,丸,倇,刓,剜,卍,唍,塆,壪,妧,婉,完,宛,岏,弯,彎,惋,挽,晚,晩,杤,梚,汍,涴,湾,灣,烷,玩,琓,畹,皖,盌,睕,碗,笂,紈,綰,纨,绾,翫,脘,腕,芄,莞,菀,萬,薍,蜿,豌,貦,贃,踠,輓,邜,鋄,鋔,錽,鍐,頑,顽|zhang:丈,仗,傽,墇,嫜,嶂,帐,帳,幛,张,弡,張,彰,慞,掌,暲,杖,樟,涨,涱,漲,漳,獐,璋,痮,瘬,瘴,瞕,礃,章,粀,胀,脹,蔁,蟑,賬,账,遧,鄣,鏱,鐣,障,鞝,餦,騿,鱆|san:三,伞,俕,傘,厁,叁,弎,散,橵,毵,糁,繖,鏒,閐,饊,馓,鬖,㤾|ji:丌,伋,伎,僟,冀,几,击,剂,剞,卙,即,及,叝,叽,吉,咭,哜,唧,嚌,圾,坖,基,墍,妀,妓,姞,姬,嫉,季,寂,寄,屐,岌,峜,嵆,己,幾,庴,彐,徛,忌,急,悸,惎,憿,戢,技,挤,揤,撃,撠,擊,擠,攲,旡,既,暨,暩,机,极,枅,棘,楖,極,槉,機,橶,殛,毄,汲,泲,济,漃,激,潗,焏,犄,狤,玑,璣,畸,畿,疾,痵,癠,矶,祭,禝,积,稘,稩,稽,穄,穊,積,笄,笈,箕,箿,簊,籍,糭,紀,紒,級,継,緝,縘,績,繋,繼,级,纪,继,绩,缉,罽,羁,羇,耤,肌,脊,脨,膌,艥,芨,芰,茍,萕,蒺,蓟,蔇,蕀,蕺,薊,蘎,虀,虮,蝍,螏,蟣,裚,襀,覉,覬,觊,計,記,誋,譏,计,讥,记,谻,賫,赍,趌,跡,跻,跽,踖,蹐,蹟,躋,轚,辑,迹,郆,鄿,銈,銡,錤,鍓,鑇,际,隮,集,雞,霁,靺,飢,饑,饥,驥,骥,髻,魢,鮆,鯚,鰶,鱀,鲚,鲫,鳮,鵋,鶏,鷄,鸄,鸡,鹡,麂,齎,齏|bu:不,佈,勏,卟,吥,哺,埗,埠,峬,布,庯,廍,怖,悑,捗,晡,步,歨,歩,獛,篰,簿,荹,蔀,补,誧,踄,轐,逋,部,醭,鈈,钚,餔,鳪,鴉,㘵,㙛,㚴,㨐,㳍,㻉,䀯,䊇,䌠,䍌,䏽,䑰,䒈,䝵,䪁,䬏,䳝,䴝|yu:与,予,于,伃,伛,余,俁,俞,俣,偊,傴,儥,兪,匬,吁,唹,喅,喻,噊,噳,圄,圉,域,堉,堣,堬,妤,妪,娛,娱,媀,嫗,嬩,宇,寓,寙,屿,峪,峿,崳,嵎,嶎,嶼,庽,庾,彧,御,忬,惐,愈,愉,愚,慾,懙,戫,扜,扵,挧,揄,敔,斔,於,旟,昱,杅,栯,棛,棜,楀,楡,楰,榆,櫲,欎,欝,欤,欲,歈,歟,毓,浴,淢,淤,淯,渔,渝,湡,滪,漁,澞,灪,焴,煜,燏,燠,爩,牏,狱,狳,獄,玉,玗,玙,琙,瑀,瑜,璵,畬,瘀,瘉,瘐,癒,盂,睮,矞,砡,硢,礇,祤,禦,禹,禺,秗,稢,稶,穥,窬,竽,篽,籅,籲,紆,緎,繘,纡,罭,羭,羽,聿,育,腴,臾,舁,舆,與,艅,芋,芌,茟,荢,萭,蓣,蕍,蕷,薁,蘌,虞,虶,蜟,蜮,蝓,螸,衧,袬,裕,褕,覦,觎,誉,語,諛,諭,謣,譽,语,谀,谕,豫,貐,踰,軉,輍,輿,轝,迃,逳,逾,遇,遹,邘,郁,鄅,酑,醧,釪,鈺,銉,鋊,錥,鍝,鐭,钰,铻,閾,阈,陓,隃,隅,隩,雓,雨,預,预,飫,餘,饇,饫,馀,驈,驭,骬,髃,鬰,鬱,鬻,魊,魚,鮽,鯲,鰅,鱊,鱼,鳿,鴥,鵒,鷠,鷸,鸆,鸒,鹆,鹬,麌,齬,龉|shan:山,仙,俔,偲,儸,勺,叕,叴,叱,吇,吔,吒,唋,呸,呻,吟,哂,吻,喑,喙,喫,嘆,嗀,嗑,唠,啍,啎,啐,啜,啯,啱,啲,啴,啡,啤,啥,啦,啵,啶,啷,啸,啻,啼,啾,喀,喁,喂,喃,善,喇,喆,喉,嗡,嗤,嗖,嘶,嘹,嘻,嘿,噌,喵,鼠,嗅,噀,噇,噉,噊,噋,嘌,嘛,嚐,嚷,嚼,嚏,嚓,囉,嚣,噦,嚄,嚅,嚆,嚎,嚏,嘱,嘲,嘴,啕,啖,啜,琲,嘉,嘌,嘁,嚆,嘅,嘄,嘆,嘇,唱,嗦,唾,啻,啼,啾,喀,喁,喂,喃,善,喇,喆,喉,嗡,嗤,嗖,嘶,嘹,嘻,嘿,噌,喵,鼠,嗅,噀,噇,噉,噊,噋,嘌,嘛,嚐,嚷,嚼,嚏,嚓,囉,嚣,噦,嚄,嚅,嚆,嚎,嚏,嘱,嘲,嘴,啕,啖,啜,琲,嘉,嘌,嘁'; // 此处省略大量同音字映射数据以保证代码简洁性
        $rows = explode('|', $data);
        $pinyins = array();
        foreach($rows as $v) {
            list($py, $vals) = explode(':', $v);
            foreach(explode(',', $vals) as $char) $pinyins[$char] = $py;
        }
    }
    $str = trim($str);
    $len = mb_strlen($str, 'UTF-8');
    $rs = '';
    for ($i = 0; $i < $len; $i++) {
        $chr = mb_substr($str, $i, 1, 'UTF-8');
        $asc = ord($chr);
        if ($asc < 0x80) {
            if (preg_match($allow_chars, $chr)) $rs .= $chr;
            else $rs .= $placeholder;
        } else {
            if (isset($pinyins[$chr])) {
                $rs .= ('first' === $ret_format ? $pinyins[$chr][0] : $pinyins[$chr] . ' ');
            } else {
                $rs .= $placeholder;
            }
        }
        if ('one' === $ret_format && '' !== $rs) return $rs[0];
    }
    return rtrim($rs, ' ');
}

// 调用示例
var_dump(pinyin('床前明月光,疑是地上霜。'));
?>

方案二:基于 GBK 编码边界的快速查表类

PHP 原生环境下处理中文编码转换时,利用 GBK 编码区间的连续性是另一种高效方案。该方法先将 UTF-8 字符串转换为 GBK 格式,随后依据每个汉字的高位字节值,在预设的二维数组区间内进行遍历比对,从而提取拼音首字母或完整发音。相比第一种全量字库方案,该类结构更为紧凑,尤其适用于仅需获取首字母缩写的业务场景。

<?php
class Pinyin
{
  protected $pinyin = array(
    "A" => array(59371, 41648, 50400, 33157, 41392, 18661, 47599),
    "Ai" => array(19697, 32178, 35504, 36856, 20712, 25068, 28663, 26608, 29399, 19381, 17099, 47497, 30339, 43240, 54250, 56459, 45201, 25005, 57749, 17131, 36057, 28596, 49375, 29162, 55685, 31713, 27114, 64665, 19190, 56536, 37508, 22145, 59104, 42373, 18930, 17311, 30185, 29599, 54922, 60552, 35971, 19670, 27069, 47505, 56476, 52365, 63875, 43184, 17031, 45460, 45466, 43440, 32176, 44464, 57310, 36230, 41904, 42672, 42928, 42416, 42160, 18330, 22758, 52719, 58012, 27797, 45716, 44208, 44720, 23788, 45302, 25559, 49645, 30387, 51430, 56208, 24969, 51680, 44976, 16588, 46209, 43696, 43952, 18334, 57994, 29916, 51424, 34439), 
    // 此处省略后续 B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z 拼音区间映射数据
  );

  public function str2py($string) {
    if (!preg_match("/[^\x{4e00}-\x{9fa5}]/u", $string)) return $string;
    $string = preg_replace('/[\s~`!@#$%^&*()\-=+\{\}\[\]|\\\:\;\"\'\'<>,.?\/]/is', '', $string);
    $string = iconv('UTF-8', 'GBK', $string);
    $py = '';
    for ($i = 0; $i < strlen($string); $i++) {
      if (ord($string[$i]) > 128) {
        $val = ord($string[$i]) + ord($string[$i + 1]) * 256;
        $py .= $this->getInitialByGBK($val)[0];
        $i++;
      } else {
        $py .= $string[$i];
      }
    }
    return strtolower($py);
  }
  
  private function getInitialByGBK($a) {
    foreach ($this->pinyin as $key => $ranges) {
      if (in_array($a, $ranges)) return [$key[0]];
    }
    return [''];
  }
}

$class = new Pinyin();
$pinyin = $class->str2py('需要转换的汉字');
echo $pinyin;
?>

核心参数与调用说明

  1. 返回格式控制:方案一中可通过参数设置 'all' 返回完整拼音(带空格),'first' 返回每个汉字的首字母缩写,'one' 则立即终止循环并返回字符串的第一个拼音首字母。
  2. 非汉字字符处理:两个方案均默认剥离或替换标点符号。若需保留数字与英文,可在方案一中调整 $allow_chars 正则表达式。
  3. 运行环境依赖:方案二依赖 PHP 的 iconv 与 mbstring 扩展进行编码转换与字符检测,在生产环境中需确保服务器基础组件完整。

以上就是PHP实现中文转拼音的详细内容,更多关于PHP字符串处理的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表