本篇文章更新時間:2023/04/11
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


這需求真是時不時會碰到,在問 ChatGPT 的時候,他直接寫一個範例:

function containsThai($str) {
  return preg_match('/\p{Thai}+/u', $str);
}

// 測試
if (containsThai("สวัสดีชาวโลก")) {
  echo "這包含泰文";
} else {
  echo "這不包含泰文";
}

其中 {Thai} 這邊可以看得出來是一個關鍵字代表了「泰文」。

往下追問想看看還可以判斷哪些語言,就提到可以從這個 PHP 官方文件 Unicode character properties 中找到對應的關鍵字來判斷。

常見的 Unicode 屬性名稱:

  • \p{Greek}:比對希臘字母字符
  • \p{Cyrillic}:比對斯拉夫語系中的字符,包括俄文、白俄羅斯文、保加利亞文、塞爾維亞語等
  • \p{Arabic}:比對阿拉伯字母字符
  • \p{Hebrew}:比對希伯來字母字符
  • \p{Han}:比對漢字字符
  • \p{Katakana}:比對片假名字符
  • \p{Hiragana}:比對平假名字符
  • \p{Thai}:比對泰文字符

然後請他把整張表都幫我註解,看到底有哪些語言文字的判斷屬性:

  • Arabic:阿拉伯文字符
  • Armenian:亞美尼亞文字符
  • Bengali:孟加拉文字符
  • Bopomofo:注音符號字符
  • Braille:點字字符
  • Buhid:布希德文字符
  • Canadian_Aboriginal:加拿大原住民字符
  • Carian:卡里亞文字符
  • Cham:占族文字符
  • Cherokee:切羅基文字符
  • Common:普通字符(不帶語言屬性)
  • Coptic:科普特文字符
  • Cuneiform:楔形文字字符
  • Cypriot:塞浦路斯文字符
  • Cyrillic:西里爾文字符
  • Deseret:德薩雷特字符
  • Devanagari:天城文字符
  • Egyptian_Hieroglyphs:埃及象形文字字符
  • Ethiopic:衣索比亞文字符
  • Georgian:喬治亞文字符
  • Glagolitic:格拉哥里文字符
  • Gothic:哥德文字符
  • Greek:希臘文字符
  • Gujarati:古吉拉特文字符
  • Gurmukhi:古木基文字符
  • Han:漢字字符
  • Hangul:韓文字符
  • Hanunoo:哈努諾文字符
  • Hebrew:希伯來文字符
  • Hiragana:平假名字符
  • Imperial_Aramaic:帝國阿拉米文字符
  • Inherited:繼承字符
  • Inscriptional_Pahlavi:碑銘巴列維文字符
  • Inscriptional_Parthian:碑銘帕提亞文字符
  • Javanese:爪哇文字符
  • Kaithi:凱蒂文字符
  • Kannada:卡納達文字符
  • Katakana:片假名字符
  • Kayah_Li:克耶字母字符
  • Kharoshthi:卡羅須提文字符
  • Khmer:高棉文字符
  • Lao:寮文字符
  • Latin:拉丁文字符
  • Lepcha:勒巴文字符
  • Limbu:林布文字符
  • Linear_B:線性 B 文字符
  • Lisu:麗僳文字符
  • Lycian:利基亞文字符
  • Lydian:印歐語系古代語言
  • Mahjong:麻將牌符號
  • Malayalam:馬來文字符
  • Mandaic:曼代文字符
  • Meetei_Mayek:米蒂-瑪雅克文字符
  • Meroitic_Cursive:體系瑪若字母文字符
  • Meroitic_Hieroglyphs:瑪若象形文字字符
  • Miao:苗文字符
  • Mongolian:蒙古文字符
  • Myanmar:緬甸文字符
  • New_Tai_Lue:新傣文字符
  • Nko:N'Ko 字母字符
  • Ogham:奧格姆文字符
  • Ol_Chiki:桑塔利文字符
  • Old_Italic:古意大利文字符
  • Old_Persian:古波斯文字符
  • Old_South_Arabian:古南阿拉伯文字符
  • Old_Turkic:古突厥文字符
  • Oriya:奧里亞文字符
  • Osmanya:奧斯曼亞文字符
  • Phags_Pa:八思巴文字符
  • Phoenician:腓尼基文字符
  • Rejang:瑞讓文字符
  • Runic:古北歐文字符
  • Samaritan:撒瑪利亞文字符
  • Saurashtra:索拉什特拉文字符
  • Sharada:莎拉達文字符
  • Shavian:蕭伯納文字符
  • Sinhala:僧伽羅文字符
  • Sora_Sompeng:索拉桑彭文字符
  • Sundanese:巽他文字符
  • Syloti_Nagri:錫爾赫特-那格里文字符
  • Syriac:敘利亞文字符
  • Tagalog:塔加路文字符
  • Tagbanwa:塔格巴努亞文字符
  • Tai_Le:傣仂文字符
  • Tai_Tham:傣南文字符
  • Tai_Viet:傣北文字符
  • Takri:塔克里文字符
  • Tamil:泰米爾文字符
  • Telugu:泰盧固文字符
  • Thaana:塔安那文字符
  • Thai:泰文字符
  • Tibetan:藏文字符
  • Tifinagh:提非納文字符
  • Ugaritic:烏加里特文字符
  • Vai:瓦伊文字符
  • Yi:彝文字符

這邊筆記一下,以後要比對哪個語言文字的時候,自己替換一下就好了!

反過來說,如果想知道一個字串裡,有包含哪些語言的文字,可以使用下列方法:

function detect_unicode_charset($str, $charsets) {
    // 定義各個字符集的正則表達式
    $regex = array(
        'Arabic' => '/\p{Arabic}/u',
        'Bengali' => '/\p{Bengali}/u',
        'Chinese' => '/\p{Han}/u',
        'Cyrillic' => '/\p{Cyrillic}/u',
        'Devanagari' => '/\p{Devanagari}/u',
        'Georgian' => '/\p{Georgian}/u',
        'Greek' => '/\p{Greek}/u',
        'Gujarati' => '/\p{Gujarati}/u',
        'Gurmukhi' => '/\p{Gurmukhi}/u',
        'Hebrew' => '/\p{Hebrew}/u',
        'Hiragana' => '/\p{Hiragana}/u',
        'Kannada' => '/\p{Kannada}/u',
        'Katakana' => '/\p{Katakana}/u',
        'Khmer' => '/\p{Khmer}/u',
        'Korean' => '/\p{Hangul}/u',
        'Lao' => '/\p{Lao}/u',
        'Latin' => '/\p{Latin}/u',
        'Malayalam' => '/\p{Malayalam}/u',
        'Myanmar' => '/\p{Myanmar}/u',
        'Oriya' => '/\p{Oriya}/u',
        'Sinhala' => '/\p{Sinhala}/u',
        'Tamil' => '/\p{Tamil}/u',
        'Telugu' => '/\p{Telugu}/u',
        'Thai' => '/\p{Thai}/u',
    );

    // 遍歷字符集並查找相符的字符
    $matches = array();
    foreach ($charsets as $charset) {
        if (isset($regex[$charset]) && preg_match($regex[$charset], $str)) {
            $matches[] = $charset;
        }
    }

    return $matches;
}

// 使用範例
$str = "Hello こんにちは สวัสดี مرحبا привет नमस्ते ನಮಸ್ಕಾರ హలో";
$charsets = array('Chinese', 'Japanese', 'Thai', 'Hindi', 'Russian');
$result = detect_unicode_charset($str, $charsets);
print_r($result); // 輸出: Array('Chinese', 'Japanese', 'Thai', 'Hindi', 'Russian')

沒有按照前段全部列出來,但就是可以自己依樣畫葫蘆補充。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon