首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 漢字轉拼音與公歷農歷互轉:兩大實用類庫完整源碼

     編輯:PHP 綜合知識

一、漢字轉拼音類 Pinyin.class.php

功能特性

  • 支持全拼輸出:hao hao xue xi tian tian xiang shang
  • 支持首字母輸出:hhxxttxs
  • 基於 GB2312 編碼區間映射表,覆蓋常用漢字
  • UTF-8 輸入自動轉碼處理

使用示例

require_once 'Pinyin.class.php';
$pinyin = new Pinyin();
$str = '好好學習天天向上';

echo $pinyin->strtopin($str);        // 全拼
echo $pinyin->strtopin($str, 1);     // 首字母

核心原理

  1. 內置 $d 靜態數組:拼音與 GB2312 區位碼映射(約 6000+ 條)
  2. g($num):根據區位碼二分查找對應拼音
  3. c($str):取單字首字母
  4. f($str):取單字全拼
  5. utf8_substr():按字符截取 UTF-8 字符串
  6. strtopin():主入口,逐字轉換並拼接

源碼結構(節選關鍵部分)

class Pinyin {
    private $d = [
        ['a', -20319], ['ai', -20317], ['an', -20304], /* ... 6000+ 條 ... */
    ];

    function g($num) { /* 區位碼查找邏輯 */ }
    function c($str) { /* 首字母邏輯 */ }
    function f($str) { /* 全拼邏輯 */ }
    function utf8_substr($str, $from, $len) { /* UTF-8 安全截取 */ }
    function strtopin($chinese, $type = 0) { /* 主方法 */ }
}

已知局限

  • 生僻字、擴展字符集(如 Unicode 擴展區)無法轉換
  • 多音字僅返回首個讀音
  • 極大字符串性能一般,可考慮緩存或 C 擴展

二、公歷農歷互轉類 Lunar.class.php

功能特性

  • 陽歷 → 陰歷:返回年、月、日、干支、生肖、閏月標識
  • 陰歷 → 陽歷:支持閏月處理(閏月按順序月份+1)
  • 覆蓋 1891-2100 年
  • 提供干支紀年、生肖、月份天數等輔助方法

使用示例

require_once 'Lunar.class.php';
$lunar = new Lunar();

// 陽歷轉陰歷:2013-09-21 → 2013年七月十六
$res = $lunar->convertSolarToLunar(2013, 9, 21);
print_r($res);
/*
Array(
    [0] => 二零一三
    [1] => 七月
    [2] => 十六
    [3] => 癸巳
    [4] => 7
    [5] => 16
    [6] => 蛇
    [7] => 0
)
*/

// 陰歷轉陽歷:2013年閏九月初十
$res = $lunar->convertLunarToSolar(2013, 10, 10); // 閏九月傳 10
print_r($res); // Array([0]=>2013 [1]=>11 [2]=>13)

核心算法說明

  1. $lunarInfo 陣列:每年編碼信息(閏月、正月初一陽歷日期、月份大小位掩碼)
  2. getDaysBetweenSolar():計算目標日期與正月初一相差天數
  3. getLunarByBetween():根據天數差反推陰歷年月日
  4. 位運算解析月份大小(29/30 天)
  5. 干支、生肖按模 10/12 循環計算

源碼關鍵方法

class Lunar {
    var $MIN_YEAR = 1891;
    var $MAX_YEAR = 2100;
    var $lunarInfo = [ /* 210 條年份編碼 */ ];

    function convertSolarToLunar($y, $m, $d) { /* 陽轉陰 */ }
    function convertLunarToSolar($y, $m, $d) { /* 陰轉陽 */ }
    function getLunarMonths($year) { /* 該年各月天數數組 */ }
    function getLeapMonth($year) { /* 閏月 */ }
    function getLunarYearName($year) { /* 干支年 */ }
    function getYearZodiac($year) { /* 生肖 */ }
    function getCapitalNum($num, $isMonth) { /* 數字轉中文:初一、廿三、正月、臘月 */ }
    // ... 其他輔助方法
}

已知問題與修正方向

  • 2021 年後數據準確性下降,需更新 $lunarInfo 陣列
  • 閏月處理邏輯在邊界情況需加強測試
  • 建議遷移至成熟庫(如 overtrue/laravel-festival、kitetail/calendars)

總結與建議

兩個類庫滿足基礎業務需求:拼音類適合搜索索引、首字母導航、URL 優化;農歷類適合日曆、節日提醒、傳統節氣展示。生產環境建議:

  1. 拼音轉換引入 overtrue/pinyin(基於詞庫、支持多音字)
  2. 農歷轉換使用 kitetail/calendars 或 php-solar-lunar(持續維護、單元測試覆蓋)
  3. 若必須自維護,建議補全單元測試、增加緩存層、定期校驗權威日曆數據
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved