| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721 |
- <?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 = [
- 'นฺทฺร',
- 'ขฺ',
- 'ฆฺ',
- 'ฉฺ',
- 'ฌฺ',
- 'ญฺ',
- 'ฐฺ',
- 'ฑฺ',
- 'ถฺ',
- 'ธฺ',
- 'ผฺ',
- 'ภฺ',
- 'กฺ',
- 'คฺ',
- 'จฺ',
- 'ชฺ',
- 'ญฺ',
- 'ฬฺ',
- 'ฏฺ',
- 'ฑฺ',
- 'ณฺ',
- 'ตฺ',
- 'ทฺ',
- 'นฺ',
- 'หฺ',
- 'ปฺ',
- 'พฺ',
- 'มฺ',
- 'ยฺ',
- 'รฺ',
- 'ลฺ',
- 'วฺ',
- 'สฺ',
- 'งฺ',
- 'งฺ',
- 'สฺส',
- 'ข',
- 'ฆ',
- 'ฉ',
- 'ฌ',
- 'ฌ',
- 'ญฺญ',
- 'ฐ',
- 'ฑ',
- 'ถ',
- 'ธ',
- 'ผ',
- 'ภ',
- 'ก',
- 'ค',
- 'จ',
- 'ช',
- 'ญ',
- 'ฬ',
- 'ฏ',
- 'ฑ',
- 'ณ',
- 'ต',
- 'ท',
- 'น',
- 'ห',
- 'ป',
- 'พ',
- 'ม',
- 'ย',
- 'ร',
- 'ร',
- 'ล',
- 'ว',
- 'ส',
- 'ฺย',
- 'ฺว',
- 'ฺร',
- 'ร',
- 'ตฺต',
- 'ตฺถ',
- 'ทฺท',
- 'ทฺธ',
- 'ฏฺฏ',
- 'ฏฺฐ',
- 'กฺก',
- 'ขฺข',
- 'คฺค',
- 'ฆฺฆ',
- 'ปฺป',
- 'ผฺผ',
- 'พฺพ',
- 'ภฺภ',
- 'จฺจ',
- 'ฉฺฉ',
- 'ชฺช',
- 'ฌฺฌ',
- 'ฺ',
- 'ฺย',
- 'ฺล',
- 'ฺม',
- 'ฺว',
- 'ฺห',
- 'สฺส',
- 'น',
- 'ต',
- 'ฏฺฐ',
- 'ฏฺฏ',
- 'ฑฺฒ',
- 'ฑฺฑ',
- 'ณฺฑ',
- 'งฺก',
- 'งฺค',
- 'งฺข',
- 'งฺฆ',
- 'ห',
- 'ิํ',
- 'ุํ',
- 'โอ',
- 'โอ',
- 'อํ',
- 'อิํ',
- 'อุํ',
- 'ํ',
- 'า',
- 'า',
- 'ิ',
- 'ี',
- 'ุ',
- 'ุ',
- 'ู',
- 'เ',
- 'อา',
- 'อา',
- 'อ',
- 'อิ',
- 'อี',
- 'อุ',
- 'อู',
- 'เอ',
- 'โอ',
- 'น',
- 'ญ',
- '',
- 'ฺ',
- 'ํ',
- 'เสฺส',
- 'เข',
- 'เฆ',
- 'เฉ',
- 'เฌ',
- 'เญฺญ',
- 'เฐ',
- 'เฑ',
- 'เถ',
- 'เธ',
- 'เผ',
- 'เภ',
- 'เก',
- 'เค',
- 'เจ',
- 'เช',
- 'เญ',
- 'เฬ',
- 'เฏ',
- 'เฑ',
- 'เณ',
- 'เต',
- 'เท',
- 'เน',
- 'เห',
- 'เป',
- 'เพ',
- 'เม',
- 'เย',
- 'เร',
- 'เล',
- 'เว',
- 'เส',
- 'เย',
- 'เว',
- 'เร',
- 'เอ',
- 'โอ',
- '๑',
- '๒',
- '๓',
- '๔',
- '๕',
- '๖',
- '๗',
- '๘',
- '๙',
- '๐',
- 'ํ',
- 'ฺ',
- 'ฯ',
- 'ฯลฯ',
- ];
- /**
- * 缅文转罗马巴利
- */
- public function myanmarToRoman(string $input): string
- {
- return str_replace(self::MYANMAR_CHARS, self::ROMAN_CHARS, $input);
- }
- /**
- * 罗马巴利转缅文
- */
- 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);
- }
- /**
- * 泰文转罗马巴利
- */
- public function thaiToRoman(string $input): string
- {
- return str_replace(self::THAI_CHARS, self::ROMAN_CHARS, $input);
- }
- /**
- * 罗马巴利转泰文
- */
- 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);
- }
- /**
- * 缅文转泰文
- */
- public function myanmarToThai(string $input): string
- {
- $roman = $this->myanmarToRoman($input);
- return $this->romanToThai($roman);
- }
- /**
- * 泰文转缅文
- */
- public function thaiToMyanmar(string $input): string
- {
- $roman = $this->thaiToRoman($input);
- return $this->romanToMyanmar($roman);
- }
- /**
- * 自动检测并转换为罗马巴利
- */
- 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;
- }
- }
|