Version 5 of A little Hangul converter

Updated 2002-07-25 12:04:31

http://mini.net/files/hangul.jpg


Richard Suchenwirth 2002-07-10 - Here is a tiny tool that may be helpful when dealing with Korean Hangul 한글 characters. You can paste in Hangul strings into the upper entry, and convert it to (approximated) Hanglish transliteration with <Return>; or type Hanglish into the bottom entry, and convert it with <Return> to Hangul if possible. You can also visualize any Unicode in the \u.... notation, as the example shows.

 proc ui {} {
    set font {Helvetica 14}
    label .1 -text Hangul:
    entry .2 -textvar ::hangul -font $font
    label .3 -text =
    entry .4 -textvar ::hanglish

    bind .2 <Return> {set ::hanglish [hangul2hanglish $::hangul]}
    bind .4 <Return> {set ::hangul   [hanglish $::hanglish]}

    grid .1 .2 -sticky news
    grid .3 .4 -sticky news
    grid columnconfigure . 1 -weight 1
 }
 proc hangul2hanglish s {
    set lead {g gg n d dd r m b bb s ss "" j jj c k t p h}
    set vowel {a ae ya yai e ei ye yei o oa oai oi yo u ue uei ui yu w wi i}
    set tail {"" g gg gs n nj nh d l lg lm lb ls lt lp lh m b bs s ss 
        ng j c k t p h}
    set res ""
    foreach c [split $s ""] {
        scan $c %c cnum
        if {$cnum>=0xAC00 && $cnum<0xD7A3} {
            incr cnum -0xAC00
            set l [expr {$cnum / (28*21)}]
            set v [expr {($cnum/28) % 21}]
            set t [expr {$cnum % 28}]
            append res  [lindex $lead $l ]
            append res  [lindex $vowel $v]
            append res "[lindex $tail $t] "
        } else {append res $c}
    }
    set res
 }
 proc hanglish2uc hanglish {
    set L ""; set V "" ;# in case regexp doesn't hit
    set hanglish [string map {
        AE R SH S R L NG Q YE X YAI F AI R YA V YO Y YU Z VI F
    } [string toupper $hanglish]]
    regexp {^([GNDLMBSQJCKTPH]+)?([ARVFEIXOYUZW]+)([GNDLMBSQJCKTPH]*)$} \
            $hanglish ->  L V T ;# lead cons.-vowel-trail cons.
        if {$L==""} {set L Q}
    if {$V==""} {return $hanglish}
    set l [lsearch {G GG N D DD L M B BB S SS Q J JJ C K T P H} $L]
    set v [lsearch {A R V F E EI X XI O OA OR OI Y U UE UEI UI Z W WI I} $V]
    set t [lsearch {"" G GG GS N NJ NH D L LG LM LB LS LT LP LH  \
            M B BS S SS Q J C K T P H} $T] ;# trailing consonants
    if {[min $l $v $t] < 0} {return $hanglish}
    format %c [expr {$l*21*28 + $v*28 + $t + 0xAC00}]
 }
 proc min args {lindex [lsort -real $args] 0}
 proc hanglish argl {
    set res ""
    foreach i $argl {
        foreach j [split $i -] {append res [hanglish2uc $j]}
    }
    append res " "
 }
 ui

Natural languages | Arts and crafts of Tcl-Tk programming