Mon May 26 2025 • 10 mins read
UTF-8 ရဲ့အရှည်က Unicode Transformation Format - 8 bits ပါ။ ဒီအဖြေက နည်းနည်းခေါင်းရှုပ်စရာပါ။ ဒီတော့ ပိုပြီး နားလည်အောင် သူရဲ့ နောက်ကွယ်ကို တဆင့်ချင်း ခြေရာခံကြည့်ပါမယ်။
သတင်းအချက်အလက်ကို သိုလှောင်ဖို့အတွက် ကွန်ပျူတာတွေက Binary System ကို အသုံးပြုပါတယ်။ Binary စနစ်မှာ အချက်အလက်တွေအားလုံးကို 0 သို့မဟုတ် 1 နဲ့သာ ကိုယ်စားပြုသတ်မှတ်ပါတယ်။ Binary စနစ်ရဲ့ အခြေခံအကျဆုံး Unit က Bit ပါ။ Bit ဆိုတာ 0 ဒါမှမဟုတ် 1 တစ်လုံးတည်းကိုသာ ဆိုလိုတာပါ။ ယေဘုယျအားဖြင့် ကွန်ပျူတာတွေရဲ့ Binary စနစ်မှာ Largest Unit က 8 Bits ပါ။ Byte လို့ ခေါ်ပါတယ်။ နမူနာပေးရရင် 01101011 ဆိုတာ 8 Bits ရှိတဲ့ Byte တခုပါပဲ။
ဒီတော့ Mobile App တွေ၊ Website တွေ၊ Facebook Post တွေအစ Calculator တွေ၊ ဘာသာစကားတွေအဆုံး ကျွန်တော်တို့ မြင်တွေ့ သုံးစွဲနေသမျှ ဒီဂျစ်တယ်အရာတိုင်းဟာ Binary System ပေါ်မှာ အခြေခံထားတာပါ။ မြင်သာအောင်ပြောရရင် ကွန်ပျူတာရဲ့ဖိုင်တွေကို Byte အရေအတွက်ပေါ်မူတည်ပြီး ရည်ညွှန်းကြသလိုပါ။ ဥပမာ၊ 1 KB ဆိုတာ Byte တစ်သောင်းတန်ဖိုးနဲ့ အကြမ်းဖျင်းညီပါတယ်။ အလားတူပဲ၊ 1GB ဆိုတာ Byte သန်းတစ်ထောင်နဲ့ အကြမ်းဖျင်းညီမျှပါတယ်။
အင်တာနက်ပေါ်မှာ အများဆုံးတွေ့ရတဲ့ အချက်အလက်တွေက စာသား (Text) တွေပါ။ အဆိုပါ စာသားတွေရဲ့ အက္ခရာတစ်လုံးချင်းတိုင်းကို ကွန်ပျူတာတွေက Bit အစုအဝေးတွေနဲ့ မှတ်သားပါတယ်။ တနည်းအားဖြင့် အင်တာနက်ပေါ်က စာသားတွေ၊ စကားလုံးတွေ၊ စာပုဒ်တွေအားလုံးကို Bit အစုအဝေးတွေနဲ့ ဖွဲ့စည်းထားတာပါ။ ဒီအတွက်ကြောင့် အက္ခရာတွေ၊ င်္သကေတတွေကို ကွန်ပျူတာနားလည်မှတ်သားနိုင်စေမယ့် Bit တွေအဖြစ် ပေါင်းလဲပေးဖို့ လိုအပ်လာပါတယ်။ အဆိုပါ လုပ်ငန်းစဉ်ကို Encoding လို့ခေါ်ပါတယ်။
ASCII: Converting Symbols to Binary
ပထမဆုံး တီထွင် အသုံးပြုခဲ့ကြတဲ့ Encoding နည်းလမ်းက ASCII ပါ။ အရှည်က American Standard Code ပါ။ ASCII က မတူညီတဲ့အက္ခရာတစ်လုံးစီအတွက် မတူညီတဲ့ Three-Digit ကုဒ်တစ်ခု (တနည်းအားဖြင့်) Unique 1Byte ကို အသုံးပြုပြီး Encode လုပ်ပါတယ်။ ASCII ကို Latin အက္ခရာတွေ၊ ကိန်းဂဏန်းတွေနဲ့ အသုံးများဆုံး င်္သကေတတွေအတွက်သာ အသုံးပြုနိုင်ပါတယ်။
ASCII ကို အသုံးပြုပြီး "Hello World" ဆိုတဲ့ စာသားလေးကို Encode လုပ်တဲ့အခါ အခုလိုရပါတယ်။
01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100
ASCII Encoding မှာ ကန့်သတ်ချက်ရှိပါတယ်။ အက္ခရာတစ်လုံးစီကို 1Byte နဲ့ Encode လုပ်တဲ့အတွက် စုစုပေါင်း အက္ခရာ 256 လုံးကိုသာ Encode လုပ်နိုင်ပါတယ်။ ASCII ကို စတင်တီထွင် အသုံးပြုကာစက အဆင်ပြေခဲ့ပေမယ့် တစ်ကမ္ဘာလုံးမှာ ကွန်ပျူတာအသုံးပြုမှု တွင်ကျယ်လာတဲ့အခါ တခြားသော ဘာသာစကားတွေအတွက် Encode လုပ်နိုင်ဖို့ လိုအပ်လာပါတယ်။ တခြားသော ဘာသာစကားတွေအတွက် မူလ ASCII ပေါ်မှာပဲ အခြေခံပြီး ထပ်မံပြင်ဆင်ထားတဲ့ Encoding စနစ်တွေ ဖန်တီးခဲ့ကြပေမယ့် အဆင်မပြေခဲ့ကြပါဘူး။ ဒီအတွက်ကြောင့် စံစနစ်တခုကို ဖန်တီးခဲ့ပါတယ်။ အဆိုပါ စံစနစ်ဆိုတာ Unicode ပါပဲ။
Unicode: A Way to Store Every Symbol, Ever
ယူနီကုဒ် စံစနစ်က ASCII ရဲ့ အက္ခရာမလုံလောက်တဲ့ပြဿနာကို ဖြေရှင်းပေးပါတယ်။ ASCII နဲ့ အလားတူပဲ၊ ယူနီကုဒ်က အက္ခရာတစ်လုံးချင်းစီကို မတူညီတဲ့ Code Point တခုအဖြစ် ကိုယ်စားပြုမှတ်သားပါတယ်။ ယူနီကုဒ်စံစနစ်က မတူညီတဲ့ Code Point ပေါင်း သန်းချီကို ထုတ်ပေးနိုင်ပြီး ကမ္ဘာပေါ်က ဘာသာစကားအားလုံးအတွက် လုံလုံလောက်လောက် Encoding လုပ်ပေးနိုင်ပါတယ်။
နမူနာ ယူနစ်ကုဒ် Code Point တွေက
“A”: Unicode point = U+0041
“က” : Unicode point = U+1000
ဒီတော့ အဆိုပါ ယူနီကုဒ် Code Point တွေကို ကွန်ပျူတာတွေနားလည်တဲ့ Binary အဖြစ်ပြောင်းလဲဖို့ လိုအပ်လာပါတယ်။
UTF-8: The Final Piece of the Puzzle
UTF-8 ဆိုတာ ယူနစ်ကုဒ်ရဲ့ Encoding စနစ်တခုပါ။ ဆိုလိုတာက ယူနစ်ကုဒ် Code Point တွေကို သက်ဆိုင်ရာ Binary အဖြစ်ပြောင်းလဲပေးနိုင်သလို Binary တွေကိုလည်း သက်ဆိုင်ရာ ယူနီကုဒ် အက္ခရာတွေအဖြစ် ပြောင်းလဲပေးနိုင်တဲ့ Encoding စနစ်ပါ။ UTF ရဲ့အရှည်က Unicode Transformation Format ပါ။
UTF-8 က အက္ခရာတစ်လုံးစီကို 1Byte အနေနဲ့ ကိုယ်စားပြုမှတ်သားပါတယ်။ 1Byte ဆိုတာ 8 Bit ပါ။ ဒီအတွက် UTF-8 လို့ခေါ်တာပါ။ တိတိကျကျပြောရရင် UTF-8 က ယူနီကုဒ် Code Point တခု (အက္ခရာတစ်လုံး) ကို အနည်းဆုံး Byte တစ်တွဲကနေ ၄ တွဲစီအဖြစ် ပြောင်းလဲပေးတာပါ။ ယူနီကုဒ်စနစ်မှာ ပထမဆုံးတွေ့ရမယ့် အက္ခရာ ၁၂၃ လုံးဟာ ASCII ထဲက ရယူထားတာပါ။ အဲဒီ ASCII အက္ခရာတွေအားလုံးကို 1Byte အနေနဲ့ Encode လုပ်ပါတယ်။ ကျန်အက္ခရာအသီးသီးကတော့ အနည်းဆုံး 2Byte ကနေ စပြီး Encode လုပ်မှာပါ။
နမူနာ အက္ခရာတွေကို သူတို့ရဲ့ သက်ဆိုင်ရာ ယူနီကုဒ် Code Point တွေနဲ့ UTF-8 Binary Encoding တန်ဖိုးကို အောက်မှာပြထားပါတယ်။
A U+0041
01000001
1Byte
က U+1000
11100010 10000000 10000000
3Bytes
か U+304B
11100011 10000010 10001011
3Bytes
𠜎 U+2070E
11110000 10100000 10011011 10001110
4Bytes
ဒီနေရာမှာ မေးစရာရှိတာက UTF-8 က ဘာကြောင့် တချို့အက္ခရာတွေကို 1Byte ယူပြီး၊ တချို့ အက္ခရာတွေကို 2Byte, 3Byte စသဖြင့် Encoding လုပ်ရတာလဲဆိုတဲ့ မေးခွန်းပါ။ ဒီမေးခွန်းအတွက် အရိုးရှင်းဆုံး အဖြေကတော့ ဖိုင်တွေရဲ့ အရွယ်အစားကို လျှော့ချနိုင်စေဖို့ပါ။ ဥပမာအားဖြင့် အသုံးအများဆုံး အက္ခရာတွေကို 1Byte တန်ဖိုးယူပြီး အတွေ့နည်းတဲ့အက္ခရာတွေအတွက် ပိုများတဲ့ Byte တန်ဖိုးရယူတဲ့နည်းလမ်းက ဖိုင်အရွယ်အစားကို သိသိသာသာလျှော့ချနိုင်စေမှာပါ။ ဒီအချက်ဟာ ယူနီကုဒ်ရဲ့ အားသာချက်ပါပဲ။
UTF-8 ကို နေ့စဉ်သုံးစွဲနေရတာပါ။ အင်တာနက်ပေါ်မှာ အတွေ့များဆုံး Encoding စနစ်က UTF-8 ပါ။ ၉၄ ရာခိုင်နူန်းသော ဝဘ်ဆိုဒ်တွေက UTF-8 ကို သုံးထားတာပါ။ အဲဒီအပြင် Data Transfer အဖြစ် အသုံးများတဲ့ JSON, XML စတဲ့နည်းပညာတွေကလည်း UTF-8 နဲ့ Encode လုပ်ပါတယ်။ အင်တာနက်ရဲ့ Standard Encoding စနစ်တခုလို့ပြောရမှာပါ။ ဒါကြောင့်ပဲ HTML Document တခုရဲ့ ထိပ်မှာ အခုလို Tag ကို အမြဲမြင်တွေ့နေရတာပါ။
<meta charset="UTF-8">
UTF-8 vs UTF-16
ယူနစ်ကုဒ်စနစ်အတွက် Encoding System က UTF-8 တစ်ခုတည်းတော့ မဟုတ်ပါဘူး။ UTF-16, UTF-32 စသည်ဖြင့်ရှိပါသေးတယ်။ အတွေ့များတဲ့ Encoding နည်းလမ်းတွေတော့ မဟုတ်ပါဘူး။ အက္ခရာတစ်လုံးစီအတွက် Encoding လုပ်ရတဲ့ Byte အရေအတွက်ပေါ်မူတည်ပြီး ကွဲပြားကြတာပါ။ UTF-8 က အက္ခရာတစ်လုံးစီကို 1,2,3,4Bytes စသည်ဖြင့် Encode လုပ်သလို UTF-16 က 2 သို့မဟုတ် 4Bytes အဖြစ် Encode လုပ်ပါတယ်။
UTF-8 ရဲ့နာမည်အတိုင်း အက္ခရာတစ်လုံးအတွက် အငယ်ဆုံး ကိုယ်စားပြုနိုင်တဲ့ Binary အရေအတွက်က 1Byte (8Bits) ပါ။ အလားတူပဲ၊ UTF-16 မှာဆိုရင် အက္ခရာတစ်လုံးအတွက် အငယ်ဆုံး ကိုယ်စားပြုနိုင်တဲ့ Binary အရေအတွက်က 2Bytes (16Bits) ပါ။ နှစ်ခုစလုံးဟာ ယူနီကုဒ် Code Point တိုင်းကို သက်ဆိုင်ရာ Binary တွေအဖြစ် အပြန်အလှန် ပြောင်းလဲပေးနိုင်ပါတယ်။ သို့ပေမယ့်၊ UTF-8 နဲ့ UTF-16 က တခုနဲ့တခု Compatible မဖြစ်ပါဘူး။ နှစ်ခုစလုံးမှာ အသုံးပြုထားတဲ့ Algorithm တွေက မတူညီကြတဲ့အတွက် အက္ခရာတစ်လုံးအတွက် ရလာဒ်နှစ်ခုဟာ တူညီမှာ မဟုတ်ပါဘူး။
နမူနာ -
Char UTF-8 UTF-16
A 1Byte 2Bytes
က 3Bytes 2Bytes
か 3Bytes 2Bytes
𠜎 4Bytes 4Bytes
လက်ရှိ ဝဘ်ဆိုဒ်အများစုက UTF-8 ကိုသာ သုံးပါတယ်။ UTF-16 ထက် UTF-8 က သိမ်းဆည်းတဲ့ Byte အရေအတွက်က သိသိသာသာနည်းပါးတဲ့အတွက်ပါ။ ဥပမာ၊ "Hello Word" ဆိုတဲ့စကားလုံးလေးအတွက် UTF-8 က 11Bytes သာ ယူပြီး UTF-16 ကတော့ 22Bytes ယူမှာပါ။ UTF-16 က င်္အဂလိပ်မဟုတ်တဲ့ တခြားသော ဘာသာစကားတွေအတွက် ပိုပြီးအဆင်ပြေပါတယ်။ ဥပမာ၊ "နေကောင်းလား" ဆိုတဲ့စကားလုံးလေးအတွက် UTF-8 က 21Bytes ယူပြီး UTF-16 ကတော့ 14Bytes သာ ယူမှာပါ။
UTF-8 က ယနေ့ အင်တာနက်နည်းပညာထဲမှာ အဓိက အကျဆုံး Encoding စနစ်ပါ။ စာသားတွေ၊ ဂဏန်းတွေ၊ သင်္ကေတတွေအပါအဝင် ကမ္ဘာပေါ်က ရှိရှိသမျှ ဘာသာစကားအားလုံးနီးပါးကို ပြောင်းလဲမှတ်သားနိုင်တဲ့ ယူနီကုဒ်စံစနစ်အတွက် UTF-8 က အရိုးရှင်းဆုံး၊ ထိရောက်ဆုံး နည်းလမ်းတခုပါပဲ။ ယူနီကုဒ်နဲ့ UTF-8 ဟာ ကမ္ဘာလုံးဆိုင်ရာ စံအဖြစ် ဖန်တီးရေးဆွဲထားတဲ့ နည်းပညာတခုဖြစ်တာကြောင့် Developer တစ်ဦးအနေနဲ့ သိရှိနားလည်ထားရင် ပိုပြီးအကျိုးရှိစေမှာ သေချာပါတယ်။
#CodeWithThura #UTF-8 #Unicode #ယူနီကုဒ် #ASCII #Encoding