Myanmar Unicode Sorting with Programming Language

တစ်ချိန်တုန်းက မြန်မာ unicode ကို ပြောင်းသုံးတဲ့ အခါမှာ နောက်ပိုင်း sorting ကိစ္စတွေ အဆင်ပြေလာလိမ့်မယ် လို့ ပြောခဲ့ဖူးပါတယ်။ မြန်မာ Unicode Sorting ကို ပုံမှန် အတိုင်း ရေးပေမယ့် programming language တော်တော်များများ မှာ support မလုပ်ပါဘူး။

ICU အတွက် Myanmar စာ sorting ကိစ္စကို သံလွင် soft ရဲ့ website မှာ ရေးထားတာ ဖတ်ခဲ့ဖူးပါတယ်။ သို့ပေမယ့် ICU မှာ support လုပ်ပြီးနောက်ပိုင်း အချိန်တော်တာ်ကြာတဲ့ အထိ programming language တွေမှာ sorting မမှန်သလို OS တွေမှာလည်း sorting မမှန်ပါဘူး။ OpenOffice မှာသာ sorting အဆင်ပြေခဲ့ဖူးပါတယ်။

Programming Language

Javascript

javascript မြန်မာစာ ကို sorting စီမယ်ဆိုရင်

var list = [ "အို","အ","အေ","အု","အော်","အော","အံ"];
list.sort();
console.log(list.join(","));
//output is wrong sorting
//အ,အို,အု,အေ,အော,အော်,အံ

Unicode ကို သုံးထားပေမယ့် sorting result က unicode order နဲ့ စီပြီးတော့ ထွက်လာပါတယ်။

December 2012 မှာ ECMA International က first edition of Standard ECMA-402 ကို ထုတ်ခဲ့ပါတယ်။ Google Chrome version 24 နောက်ပိုင်းကနေ စတင် support လုပ်ပြီးတော့ Firefox ကတော့ version 31 နောက်ပိုင်းမှာ support လုပ်ပါတယ်။ IE ကတော့ 11 နဲ့ နောက်ထွက်မယ့် Edge မှာ Support လုပ်ပါတယ်။

EMCA 402 မှာ Intl ဆိုတာ ပါလာပါတယ်။ Intl ကို အသုံးပြုပြီးတော့ ကျွန်တောတို့တွေ မြန်မာစာကို javascript နဲ့ sort လုပ်နိုင်ပါတယ်။

var list = [ "အို","အ","အေ","အု","အော်","အော","အံ"];
var collator = new Intl.Collator("my-MM");
list.sort(collator.compare);
console.log(list.join(", "));
//output is
//အ, အု, အေ, အော, အော်, အံ, အို

js sorting

သို့ပေမယ့် node.js 0.12 မှာ Intl ပါလာပေမယ့် ICU အကုန်လုံးကို support မလုပ်ပါဘူး။ io.js verson 2 အထိတော့ Intl ကို support မလုပ်ပါဘူး။

Java

Java မှာတော့ CollationKey ကို အသုံးပြုပြီးတော့ မြန်မာစာ sorting လုပ်ပေမယ့် မမှန်သေးပါဘူး။

Swift

Swift မှာတော့ မြန်မာစာ sorting ကို အပြည့်အဝ အလုပ်လုပ်ပေးပါတယ်။

var list = [ "အို","အ","အေ","အု","အော်","အော","အံ"]

let my_MM = NSLocale(localeIdentifier: "my_MM")

list.sort( {

  let aRange = $0.startIndex..<$0.endIndex

  return ($0.compare($1, options: nil, range: aRange, locale: my_MM) == .OrderedAscending)

})

println(list)
//output is
//အ, အု, အေ, အော, အော်, အံ, အို

swift sorting

တကယ်လို့ Array မသုံးဖူး NSArray ကို အသုံးပြုမယ်ဆိုရင်တော့

var listArr = [ "အို","အ","အေ","အု","အော်","အော","အံ"] as NSArray

listArr = listArr.sortedArrayUsingComparator({

  var a = $0 as! String

  var b = $1 as! String

  let aRange = a.startIndex..<a.endIndex

  return a.compare(b, options: nil, range: aRange, locale: my_MM)
})

swift nsarray

လက်ရှိ စာလုံးတွေကို sorting စီချင်တဲ့ အခါမှာ text file ကို swift ကနေ ပြန်ဖတ်ပြီးတော့ sorting စီတယ်။ ပြီးတော့ text file ပြန်ထုတ်ပေးအောင် ရေးလိုက်တယ်။ အတော်လေးကို အဆင်ပြေတယ်ဆိုရင်မယ်။

Go

Google က ထုတ်ထားတဲ့ Go language နဲ့ sorting စီမယ်ဆိုရင်တော့ collate ကို အသုံးပြုပြီး စီလို့ရပါတယ်။ ပုံမှန် သမာရိုးကျ sort နဲ့တော့ မရပါဘူး။

package main

import (
  "golang.org/x/text/collate"
  "golang.org/x/text/language"
  "fmt"
)

func main() {
  unsorted := []string{"အို", "အ", "အေ", "အု", "အော်", "အော", "အံ"}
  col := collate.New(language.Burmese)
  col.SortStrings(unsorted)
  fmt.Printf("%q\n", unsorted)
}

PHP

PHP နဲ့ဆိုရင်တော့ Intl ကို သွင်းဖို့ လိုပါတယ်။

sudo pecl install intl

တကယ်လို့ ubuntu မှာဆိုရင်တော့

sudo apt-get install php5-intl

ပြီးရင်တော့ ကျွန်တော်တို့တွေ intl class ကို အသုံးပြုလို့ရပါပြီ။

<?php
$list =  [ "အို","အ","အေ","အု","အော်","အော","အံ"];
$coll = collator_create( 'my_MM' );
collator_sort($coll,$list);
foreach ($list as $key => $value) {
    echo $value;
}

တခြား language တွေ အကုန်တော့ ကျွန်တော် မစမ်းကြည့် ရသေးဘူး။ သို့ပေမယ့် swift နဲ့ javascript မှာ support လုပ်တဲ့အတွက် ကျွန်တော့် အတွက် အတော့်ကို လုံလောက်ပြီလို့ ဆိုရမယ်။

မကြာခင်မှာ io.js မှာလည်း မြန်မာစာ sorting စီဖို့အတွက် Intl ကို support လုပ်လာမယ်လို့ မျှော်လင့်ရပါတယ်။

4 Comments

  1. I believe Golang also support Myanmar sorting ? Here’s the test http://play.golang.org/p/e9KqHT5PP9

    1. saturngod says:

      I just updated Go Lang in the post.

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.