FairWay

web development
To Smarter, Greener World

PHP: Syllables Count Function for Myanmar Unicode String

မနေ့က Web SIG Facebook Group ထဲမှာ မေးခွန်းလေးတစ်ခုကို တွေ့လိုက်မိပါတယ်။ “Unicode String တစ်ခုမှာပါတဲ့ စာလုံးအရေအတွက်ကို PHP နဲ့ ဘယ်လို ရှာရလဲ” ဆိုတဲ့ မေးခွန်းလေးပါ။ PHP နဲ့ String တစ်ခုမှာပါတဲ့ Character အရေအတွက်ကို ရှာချင်တဲ့အခါ strlen() Function သုံးပြီး ရှာရပါတယ်။ ဒါပေမယ့် အဲ့ဒီ Function က ASCII string တွေအတွက်ပဲ အဆင်ပြေပါတယ်။ မြန်မာယူနီကုဒ်လို Multi-Byte Character တွေအတွက်ဆိုရင် အဆင်မပြေပါဘူး။

strlen("Hello, World!") လို့ရှာရင် အဖြေက ပါဝင်တဲ့စာလုံးအရေအတွက်အတိုင်း 13 လို့ရမှာပါ။ ဒါပေမယ့် strlen("မြန်မာ") ဆိုရင် အဖြေက 18 လို့ ထွက်နေမှာဖြစ်ပါတယ်။ မမှန်တော့ပါဘူး။ ဒါလိုကိစ္စမျိုးကို ဖြေရှင်းဖို့ PHP မှာ mb_ နဲ့စတဲ့ Multi-Byte String Function တွေ ရှိပါတယ်။ အဲ့ဒီထဲက mb_strlen() ဆိုတဲ့ Function ကို အသုံးပြုမှ မှန်မှာဖြစ်ပါတယ်။

ဥပမာ – mb_strlen("မြန်မာ", "UTF-8") ဆိုရင် အဖြေ 6 လို့ထွက်မှာဖြစ်ပါတယ်။ သိမ်းထားတဲ့ Character က အားလုံး (၆) လုံးရှိလို့ဖြစ်ပါတယ်။ (မ + ြ + န + ် + မ + ာ) အားလုံး (၆) လုံးပါ။ အဖြေက ( မြန် + မာ ) ဆိုတော့ (၂) ဖြစ်ရမှာ မဟုတ်ဘူးလားလို့ မေးစရာရှိပါတယ်။ ကျွန်တော်တို့က Character ကို ရေတွက်ချင်တာဆိုရင် ရလဒ် (၆) ဖြစ်တာ မှန်ပါတယ်။ ဒါပေမယ့် Syllables အလိုက် (မြန်) တစ်လုံး (မာ) တစ်လုံး ရေတွက်ချင်တာဆိုရင်တော့ အဖြေက (၂) ဖြစ်မှ မှန်မှာပါ။

PHP မှာ မြန်မာယူနီကုဒ် စာလုံးအရေအတွက်ကို Syllable လိုက် ရှာပေးနိုင်တဲ့ Function မရှိပါဘူး။ ဒါကြောင့် စိတ်ကူးလေးပေါက်တာနဲ့ တစ်ခုလောက် ကိုယ်တိုင် ဖန်တီးကြည့်ဖြစ်ပါတယ်။ ပထမတော့  Syllable Break လုပ်တဲ့ Algorithm တစ်ခုရှာပြီး ရေးရမယ်လို့ ယူဆပေမယ့် လက်တွေ့စမ်းကြည့်တော့ မလိုအပ်တာကို တွေ့ရပါတယ်။

Source Code ကိုသာ ဖတ်ကြည့်လိုက်ပါ။

Function (၃) ခုပါ ပါတယ်။ အမှန်တစ်ကယ် အသုံးပြုရမှာက mmstrlen() ဆိုတဲ့ Function ဖြစ်ပါတယ်။ အသုံးပြုပုံနမူနာနဲ့ ယှဉ်တွဲပြီးတော့ ကြည့်ပါ။

$str = "မြန်မာစာသည် ဒို့စာ၊ မြန်မာစကားသည် ဒို့စကား။";

echo strlen($str);				// 123
echo mb_strlen($str, "UTF-8");		// 43
echo mmstrlen($str);				// 19

“မြန်မာစာသည် ဒို့စာ၊ မြန်မာစကားသည် ဒို့စကား။” ဆိုတဲ့စာကြောင်းကို strlen() နဲ့ စစ်ကြည့်တော့ စာလုံးရေ 123 လို့ အဖြေထွက်ပါတယ်။ mb_strlen() နဲ့ စစ်ကြည့်တော့ စာလုံးရေ 43 လို့ထွက်ပါတယ်။ ကျွန်တော်ဖန်တီးထားတဲ့ mmstrlen() နဲ့စစ်ကြည့်လိုက်တော့မှ ပါဝင်တဲ့ Syllable အရေအတွက်မှန်ဖြစ်တဲ့ 19 ဆိုတဲ့အဖြေ ရရှိတာကို တွေ့ရပါလိမ့်မယ်။

mmstrlen() Function ရေးသားထားပုံကို အနည်းငယ် ရှင်းပြချင်ပါတယ်။ Syllable Break Algorithm တစ်ခုလိုမယ်ထင်ပေမယ့် မလိုတာကိုတွေ့ရပါတယ်။ ကျွန်တော် စဉ်းစားပုံက  ရိုးရိုးလေးပါ။

  1. စာကြောင်းထဲမှာ ဗျည်း ဘယ်နှလုံးပါလဲ ရေတွက်ပါတယ် (နမူနာစာကြောင်းမှာ ၁၈ လုံးပါ ပါတယ်)။
  2. ပြီးတော့ မြန်မာစာမဟုတ်တဲ့စာလုံး ပါရင်လည်း ထည့်ရေတွက်ပါတယ် (Space ၃ ကို ထည့်ရေတွက်ပါတယ်)။
  3. တစ်ခါ ၁-၉ နံပါတ်တွေ ပါရင်လည်း ထည့်ရေတွက်ပါတယ် (နမူနာစာကြောင်းမှာ မပါပါဘူး)။
  4. ပြီးတော့ “ဤ” တို့ “၍” တို့လို သီးခြားစာလုံးတွေကို လည်း ထည့်သွင်းရေတွက်ပါတယ်(နမူနာစာကြောင်းမှာ ပုဒ်ကလေးနဲ့ ပုဒ်မ ၂ ခုကို ထည့်သွင်း ရေတွက်ပါတယ်)။
  5. ရလာတဲ့ ရလဒ်ထဲကနေ အသတ် (်) ကပ်ရပ်ပါတဲ့ ဗျည်းအရေအတွက်ကို ပြန်နှုတ်ယူပါတယ် (နမူနာမှာ န် + ည် + န် + ည် လေးခုကို ပြန်နှုတ်ပါတယ်)
  6. အသတ်တို့၊ ရရစ်တို့ကို ထည့်ပြီး မရေတွက်ပါဘူး။

မှတ်ချက် ။ ။ နောက်တစ်ခေါက် ပြန်ဖတ်ကြည့်မှ သတိထားမိပါတယ်။ အသတ်တွေ့ရင် သူ့ရှေ့ကစာလုံး ဗျည်းဟုတ်လား စစ်နေစရာမလိုပါဘူး။ အသတ်တစ်ခုတွေ့တိုင်း Count ကို နှုတ်နှုတ်သွားလို့တောင် ရနိုင်ပါတယ်။

ဒီနည်းနဲ့ Syllable Break Algorithm တစ်ခုမပါပဲ စာကြောင်းတစ်ကြောင်းမှာ Syllables ဘယ်နှစ်လုံးပါလဲ ရေတွက်နိုင်သွားပါတယ်။ အသေအချာ သုတေသနပြု ဖန်တီးထားတာမဟုတ်လို့ ၁၀၀% မှန်ပါမယ်လို့ အာမမခံနိုင်သေးပါဘူး။ အများကြီး စမ်းသပ်ကြည့်ရဦးမှာပါ။

ကျွန်တော့်နားလည်ထားတဲ့ “အသတ်မပါတဲ့ ဗျည်းအားလုံးကို ထည့်သွင်းရေတွက်ရမယ်” ဆိုတဲ့အယူအဆ မှန်မမှန် မြန်မာစာကျွမ်းကျင်သူတွေ လက်ရှိ သုတေသနလုပ်နေသူတွေကို သေချာအောင် ထပ်မေးရဦးမှာပါ။

တစ်ခြား Function နှစ်ခုမှာ burmese() Function က စာလုံးတစ်လုံးဟာ မြန်မာစာလုံးဟုတ်မဟုတ် စစ်ပေးပါတယ်။ သူနဲ့တွဲသုံးဖို့ လိုတဲ့အတွက် utf82uni() Function ကိုလည်း ထည့်ထားရပါတယ်။ အဲ့ဒီ Function က UTF-8 စာလုံးတစ်လုံးကို Unicode Hex Value တစ်ခု ပြောင်းပေးပါတယ်။ ဥပမာ – “က” ပေးလိုက်ရင် သူရဲ့ ယူနီကုဒ်တန်ဖိုးကို “0×1000” ဆိုပြီး ပြန်ထုပ်ပေးပါတယ်။ အမှန်တော့ ဒီ Function အရှည်ကြီး မပါပဲနဲ့လဲ စစ်လို့ရနိုင်ပါတယ်။ PHP မှာ Unicode Hex Value ထုပ်ပေးတဲ့ Build-in Function မရှိတဲ့အတွက် နောင် ကိုးကားစရာရအောင် တမင်ထည့်ထားလိုက်တာပါ။

အသုံးလိုရင် လွပ်လွပ်လပ်လပ် ယူသုံးနိုင်သလို၊ ပြုပြင်သင့်တာ မြင်မိရင်လည်း (Github မှာ) ထောက်ပြဆွေးနွေးနိုင်ပါတယ်။

 မှတ်ချက် ။ ။ ဒီ Function က မြန်မာယူနီကုဒ် String တွေအတွက်ပဲ အလုပ်လုပ်မှာဖြစ်ပါတယ်။ Zawgyi မြန်မာစာ String တွေအတွက် အသုံးပြုချင်ရင်တော့ ဒီထက်အနည်းငယ်ပိုပြီး ရှုပ်ထွေးတဲ့ လုပ်ဆောင်ချက်တစ်ချို့နဲ့ ဖြည့်စွက်ပြင်ဆင်ဖို့ လိုအပ်နိုင်ပါတယ်။

ကျေးဇူးတင်ပါတယ်။