早期中文輸入法碼表 (如 Windows 內建拼音輸入法匯出的 winpy.txt) 可轉換為 PHP 陣列,實現簡易漢字轉拼音功能。本文示範碼表轉換、序列化快取、以及給文字標註拼音的應用範例。
winpy.txt 典型每行格式:
啊 a
阿 a
呵 a
...
漢 han
字 zi
每行前 2 個位元組為漢字 (Big5/GBK 雙位元組),後方為拼音 (ASCII)。
<?php
$cacheFile = 'pymb.txt'; // 序列化快取
$sourceFile = 'winpy.txt'; // 原始碼表
if (file_exists($cacheFile)) {
$fp = fopen($cacheFile, 'r');
$pymb = unserialize(fread($fp, filesize($cacheFile)));
fclose($fp);
} else {
$fp = fopen($sourceFile, 'r');
$pymb = [];
while (!feof($fp)) {
$line = fgets($fp, 128);
// 解析:前 2 bytes 漢字,其餘為拼音
// 注意:此處假設單字編碼,實際需依編碼處理
sscanf($line, "%2s%s", $ch, $py);
if ($ch >= "啊" && ord($py) < 128) { // 簡易過濾
$pymb[$ch] = $py;
}
}
fclose($fp);
// 寫入快取
$fp = fopen($cacheFile, 'w');
fwrite($fp, serialize($pymb) . " ");
fclose($fp);
}
// 使用範例
echo $pymb['漢'] . ' ' . $pymb['字']; // 輸出: han zi
?>
<?php
function get_py($text) {
global $pymb;
$len = strlen($text);
$result = [];
for ($i = 0; $i < $len; $i += 2) { // 假設雙位元組編碼 (GBK/Big5)
$ch = substr($text, $i, 2);
if (isset($pymb[$ch])) {
$result[] = $pymb[$ch];
} else {
$result[] = $ch; // 未找到保留原字
}
}
return implode(' ', $result);
}
// 使用
$text = "漢字拼音";
echo get_py($text); // 輸出: han zi pin yin
?>
手工維護碼表極其繁瑣且不支援多音字、分詞。現代專案請直接使用成熟套件:
composer require overtrue/pinyin
<?php
use Overtrue\Pinyin\Pinyin;
$pinyin = new Pinyin();
// 預設輸出: ['han', 'zi', 'pin', 'yin']
print_r($pinyin->convert('漢字拼音'));
// 保留聲調: ['hàn', 'zì', 'pīn', 'yīn']
print_r($pinyin->convert('漢字拼音', PINYIN_TONE));
// 只取首字母: ['h', 'z', 'p', 'y']
print_r($pinyin->convert('漢字拼音', PINYIN_FIRST_LETTER));
// 多音字處理: 返回陣列
print_r($pinyin->convert('重慶', PINYIN_ALL)); // [['zhòng','chóng'], ['qìng']]
pinyin-data 詞庫 (數萬常用字),支援多音字、分詞優化。手工碼表轉換僅適合教學或極簡場景。實際專案請使用 overtrue/pinyin 等成熟套件,節省開發時間並獲得準確的多音字、分詞支援。