| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738 |
- <?php
- namespace App\Services;
- /**
- * 控制器中
- public function convert(PaliTransliterationService $pali)
- {
- $result = $pali->myanmarToRoman('သမ္မာ');
- }
- // 或者使用 app() 助手函数
- $pali = app(PaliTransliterationService::class);
- $result = $pali->thaiToRoman('สมฺมา');
- */
- class RomanizeService
- {
- /**
- * 缅文字母映射表
- */
- private const MYANMAR_CHARS = [
- "ႁႏၵ",
- "ခ္",
- "ဃ္",
- "ဆ္",
- "ဈ္",
- "ည္",
- "ဌ္",
- "ဎ္",
- "ထ္",
- "ဓ္",
- "ဖ္",
- "ဘ္",
- "က္",
- "ဂ္",
- "စ္",
- "ဇ္",
- "ဉ္",
- "ဠ္",
- "ဋ္",
- "ဍ္",
- "ဏ္",
- "တ္",
- "ဒ္",
- "န္",
- "ဟ္",
- "ပ္",
- "ဗ္",
- "မ္",
- "ယ္",
- "ရ္",
- "လ္",
- "ဝ္",
- "သ္",
- "င္",
- "င်္",
- "ဿ",
- "ခ",
- "ဃ",
- "ဆ",
- "ဈ",
- "စျ",
- "ည",
- "ဌ",
- "ဎ",
- "ထ",
- "ဓ",
- "ဖ",
- "ဘ",
- "က",
- "ဂ",
- "စ",
- "ဇ",
- "ဉ",
- "ဠ",
- "ဋ",
- "ဍ",
- "ဏ",
- "တ",
- "ဒ",
- "န",
- "ဟ",
- "ပ",
- "ဗ",
- "မ",
- "ယ",
- "ရ",
- "႐",
- "လ",
- "ဝ",
- "သ",
- "aျ္",
- "aွ္",
- "aြ္",
- "aြ",
- "ၱ",
- "ၳ",
- "ၵ",
- "ၶ",
- "ၬ",
- "ၭ",
- "ၠ",
- "ၡ",
- "ၢ",
- "ၣ",
- "ၸ",
- "ၹ",
- "ၺ",
- "႓",
- "ၥ",
- "ၧ",
- "ၨ",
- "ၩ",
- "်",
- "ျ",
- "ႅ",
- "ၼ",
- "ွ",
- "ႇ",
- "ႆ",
- "ၷ",
- "ၲ",
- "႒",
- "႗",
- "ၯ",
- "ၮ",
- "႑",
- "kaၤ",
- "gaၤ",
- "khaၤ",
- "ghaၤ",
- "aှ",
- "aိံ",
- "aုံ",
- "aော",
- "aေါ",
- "aအံ",
- "aဣံ",
- "aဥံ",
- "aံ",
- "aာ",
- "aါ",
- "aိ",
- "aီ",
- "aု",
- "aဳ",
- "aူ",
- "aေ",
- "အါ",
- "အာ",
- "အ",
- "ဣ",
- "ဤ",
- "ဥ",
- "ဦ",
- "ဧ",
- "ဩ",
- "ႏ",
- "ၪ",
- "a္",
- "္",
- "aံ",
- "ေss",
- "ေkh",
- "ေgh",
- "ေch",
- "ေjh",
- "ေññ",
- "ေṭh",
- "ေḍh",
- "ေth",
- "ေdh",
- "ေph",
- "ေbh",
- "ေk",
- "ေg",
- "ေc",
- "ေj",
- "ေñ",
- "ေḷ",
- "ေṭ",
- "ေḍ",
- "ေṇ",
- "ေt",
- "ေd",
- "ေn",
- "ေh",
- "ေp",
- "ေb",
- "ေm",
- "ေy",
- "ေr",
- "ေl",
- "ေv",
- "ေs",
- "ေy",
- "ေv",
- "ေr",
- "ea",
- "eā",
- "၁",
- "၂",
- "၃",
- "၄",
- "၅",
- "၆",
- "၇",
- "၈",
- "၉",
- "၀",
- "း",
- "့",
- "။",
- "၊"
- ];
- /**
- * 罗马巴利字母映射表
- */
- private const ROMAN_CHARS = [
- "ndra",
- "kh",
- "gh",
- "ch",
- "jh",
- "ññ",
- "ṭh",
- "ḍh",
- "th",
- "dh",
- "ph",
- "bh",
- "k",
- "g",
- "c",
- "j",
- "ñ",
- "ḷ",
- "ṭ",
- "ḍ",
- "ṇ",
- "t",
- "d",
- "n",
- "h",
- "p",
- "b",
- "m",
- "y",
- "r",
- "l",
- "v",
- "s",
- "ṅ",
- "ṅ",
- "ssa",
- "kha",
- "gha",
- "cha",
- "jha",
- "jha",
- "ñña",
- "ṭha",
- "ḍha",
- "tha",
- "dha",
- "pha",
- "bha",
- "ka",
- "ga",
- "ca",
- "ja",
- "ña",
- "ḷa",
- "ṭa",
- "ḍa",
- "ṇa",
- "ta",
- "da",
- "na",
- "ha",
- "pa",
- "ba",
- "ma",
- "ya",
- "ra",
- "ra",
- "la",
- "va",
- "sa",
- "ya",
- "va",
- "ra",
- "ra",
- "្ta",
- "្tha",
- "្da",
- "្dha",
- "្ṭa",
- "្ṭha",
- "្ka",
- "្kha",
- "្ga",
- "្gha",
- "្pa",
- "្pha",
- "្ba",
- "្bha",
- "្ca",
- "្cha",
- "្ja",
- "្jha",
- "្a",
- "្ya",
- "្la",
- "្ma",
- "្va",
- "្ha",
- "ssa",
- "na",
- "ta",
- "ṭṭha",
- "ṭṭa",
- "ḍḍha",
- "ḍḍa",
- "ṇḍa",
- "ṅka",
- "ṅga",
- "ṅkha",
- "ṅgha",
- "ha",
- "iṃ",
- "uṃ",
- "o",
- "o",
- "aṃ",
- "iṃ",
- "uṃ",
- "aṃ",
- "ā",
- "ā",
- "i",
- "ī",
- "u",
- "u",
- "ū",
- "e",
- "ā",
- "ā",
- "a",
- "i",
- "ī",
- "u",
- "ū",
- "e",
- "o",
- "n",
- "ñ",
- "",
- "",
- "aṃ",
- "sse",
- "khe",
- "ghe",
- "che",
- "jhe",
- "ññe",
- "ṭhe",
- "ḍhe",
- "the",
- "dhe",
- "phe",
- "bhe",
- "ke",
- "ge",
- "ce",
- "je",
- "ñe",
- "ḷe",
- "ṭe",
- "ḍe",
- "ṇe",
- "te",
- "de",
- "ne",
- "he",
- "pe",
- "be",
- "me",
- "ye",
- "re",
- "le",
- "ve",
- "se",
- "ye",
- "ve",
- "re",
- "e",
- "o",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "0",
- "\"",
- "'",
- ".",
- ","
- ];
- /**
- * 泰文字母映射表
- */
- private const THAI_CHARS = [
- "นฺทฺร",
- "ขฺ",
- "ฆฺ",
- "ฉฺ",
- "ฌฺ",
- "ญฺ",
- "ฐฺ",
- "ฑฺ",
- "ถฺ",
- "ธฺ",
- "ผฺ",
- "ภฺ",
- "กฺ",
- "คฺ",
- "จฺ",
- "ชฺ",
- "ญฺ",
- "ฬฺ",
- "ฏฺ",
- "ฑฺ",
- "ณฺ",
- "ตฺ",
- "ทฺ",
- "นฺ",
- "หฺ",
- "ปฺ",
- "พฺ",
- "มฺ",
- "ยฺ",
- "รฺ",
- "ลฺ",
- "วฺ",
- "สฺ",
- "งฺ",
- "งฺ",
- "สฺส",
- "ข",
- "ฆ",
- "ฉ",
- "ฌ",
- "ฌ",
- "ญฺญ",
- "ฐ",
- "ฑ",
- "ถ",
- "ธ",
- "ผ",
- "ภ",
- "ก",
- "ค",
- "จ",
- "ช",
- "ญ",
- "ฬ",
- "ฏ",
- "ฑ",
- "ณ",
- "ต",
- "ท",
- "น",
- "ห",
- "ป",
- "พ",
- "ม",
- "ย",
- "ร",
- "ร",
- "ล",
- "ว",
- "ส",
- "ฺย",
- "ฺว",
- "ฺร",
- "ร",
- "ตฺต",
- "ตฺถ",
- "ทฺท",
- "ทฺธ",
- "ฏฺฏ",
- "ฏฺฐ",
- "กฺก",
- "ขฺข",
- "คฺค",
- "ฆฺฆ",
- "ปฺป",
- "ผฺผ",
- "พฺพ",
- "ภฺภ",
- "จฺจ",
- "ฉฺฉ",
- "ชฺช",
- "ฌฺฌ",
- "ฺ",
- "ฺย",
- "ฺล",
- "ฺม",
- "ฺว",
- "ฺห",
- "สฺส",
- "น",
- "ต",
- "ฏฺฐ",
- "ฏฺฏ",
- "ฑฺฒ",
- "ฑฺฑ",
- "ณฺฑ",
- "งฺก",
- "งฺค",
- "งฺข",
- "งฺฆ",
- "ห",
- "ิํ",
- "ุํ",
- "โอ",
- "โอ",
- "อํ",
- "อิํ",
- "อุํ",
- "ํ",
- "า",
- "า",
- "ิ",
- "ี",
- "ุ",
- "ุ",
- "ู",
- "เ",
- "อา",
- "อา",
- "อ",
- "อิ",
- "อี",
- "อุ",
- "อู",
- "เอ",
- "โอ",
- "น",
- "ญ",
- "",
- "ฺ",
- "ํ",
- "เสฺส",
- "เข",
- "เฆ",
- "เฉ",
- "เฌ",
- "เญฺญ",
- "เฐ",
- "เฑ",
- "เถ",
- "เธ",
- "เผ",
- "เภ",
- "เก",
- "เค",
- "เจ",
- "เช",
- "เญ",
- "เฬ",
- "เฏ",
- "เฑ",
- "เณ",
- "เต",
- "เท",
- "เน",
- "เห",
- "เป",
- "เพ",
- "เม",
- "เย",
- "เร",
- "เล",
- "เว",
- "เส",
- "เย",
- "เว",
- "เร",
- "เอ",
- "โอ",
- "๑",
- "๒",
- "๓",
- "๔",
- "๕",
- "๖",
- "๗",
- "๘",
- "๙",
- "๐",
- "ํ",
- "ฺ",
- "ฯ",
- "ฯลฯ"
- ];
- /**
- * 缅文转罗马巴利
- *
- * @param string $input
- * @return string
- */
- public function myanmarToRoman(string $input): string
- {
- return str_replace(self::MYANMAR_CHARS, self::ROMAN_CHARS, $input);
- }
- /**
- * 罗马巴利转缅文
- *
- * @param string $input
- * @return string
- */
- public function romanToMyanmar(string $input): string
- {
- // 手动构建映射数组,遇到重复的键时保留第一个
- $mapping = [];
- foreach (self::ROMAN_CHARS as $index => $roman) {
- if (!isset($mapping[$roman])) {
- $mapping[$roman] = self::MYANMAR_CHARS[$index];
- }
- }
- // 按键长度降序排序,优先匹配较长的字符串
- uksort($mapping, function ($a, $b) {
- $lenDiff = strlen($b) - strlen($a);
- if ($lenDiff !== 0) {
- return $lenDiff;
- }
- return strcmp($a, $b);
- });
- return str_replace(array_keys($mapping), array_values($mapping), $input);
- }
- /**
- * 泰文转罗马巴利
- *
- * @param string $input
- * @return string
- */
- public function thaiToRoman(string $input): string
- {
- return str_replace(self::THAI_CHARS, self::ROMAN_CHARS, $input);
- }
- /**
- * 罗马巴利转泰文
- *
- * @param string $input
- * @return string
- */
- public function romanToThai(string $input): string
- {
- // 手动构建映射数组,遇到重复的键时保留第一个
- $mapping = [];
- foreach (self::ROMAN_CHARS as $index => $roman) {
- if (!isset($mapping[$roman])) {
- $mapping[$roman] = self::THAI_CHARS[$index];
- }
- }
- // 按键长度降序排序,优先匹配较长的字符串
- uksort($mapping, function ($a, $b) {
- $lenDiff = strlen($b) - strlen($a);
- if ($lenDiff !== 0) {
- return $lenDiff;
- }
- return strcmp($a, $b);
- });
- return str_replace(array_keys($mapping), array_values($mapping), $input);
- }
- /**
- * 缅文转泰文
- *
- * @param string $input
- * @return string
- */
- public function myanmarToThai(string $input): string
- {
- $roman = $this->myanmarToRoman($input);
- return $this->romanToThai($roman);
- }
- /**
- * 泰文转缅文
- *
- * @param string $input
- * @return string
- */
- public function thaiToMyanmar(string $input): string
- {
- $roman = $this->thaiToRoman($input);
- return $this->romanToMyanmar($roman);
- }
- /**
- * 自动检测并转换为罗马巴利
- *
- * @param string $input
- * @return string
- */
- public function toRoman(string $input): string
- {
- // 检测是否包含缅文字符
- if (preg_match('/[\x{1000}-\x{109F}]/u', $input)) {
- return $this->myanmarToRoman($input);
- }
- // 检测是否包含泰文字符
- if (preg_match('/[\x{0E00}-\x{0E7F}]/u', $input)) {
- return $this->thaiToRoman($input);
- }
- // 默认返回原文
- return $input;
- }
- }
|