[Ruby] 한글날 기념 코딩. 한글 자소 분해

2010-10-09   //   alexken작성   //   기술  //  1 Comment

치매방지겸 한글날 기념으로 한글 음절을 자소로 분해하는 코딩.

즉 Unicode2.0에서 초,중,종성으로 조합가능한 모든 현대 한글 음절 11172를 빠짐없이 배치하였기에, 완성형 코드인 유니코드가 조합형 코드로서의 특징을 가지게 된다는 걸 보여주기 위해 코딩.

원래 조합형 코드에서 자소 분해는 비트를 잘라 초중종을 얻어 낸다면, 유니코드에서는 아래와 같이 나누기만 잘하면 초중종성을 얻어낼 수 있다.


한글의 과학성에 또 한번 감탄

소스 코드

#!/usr/bin/env ruby

@chosung_list = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ",
                 "ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ" ]
@jungsung_list = ["ㅏ","ㅐ","ㅑ","ㅒ","ㅓ","ㅔ","ㅕ","ㅖ","ㅗ","ㅘ",
                 "ㅛ","ㅙ","ㅚ","ㅜ","ㅝ","ㅞ","ㅟ","ㅠ","ㅡ","ㅢ","ㅣ"]
@jongsung_list = [" ","ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄹ","ㄺ",
                 "ㄻ","ㄼ","ㄽ","ㄾ","ㄿ","ㅀ","ㅁ","ㅂ","ㅄ","ㅅ",
                 "ㅆ","ㅇ","ㅈ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]

def unicode_of(a)
  a.unpack("U*").pop
end

class String
  def succ
    head = self.unpack('U*')
    tail = head.pop
    return head.pack('U*') + [tail + 1].pack('U*')
  end
end

def split( ch )
  offset = unicode_of("가")
  unicode = unicode_of( ch )

  print ch + "=("
  #초성출력
  print @chosung_list[ (unicode - offset) / 
                       (@jungsung_list.length * @jongsung_list.length) ] + "+"
  #중성출력
  print @jungsung_list[(unicode - offset) % 
                       (@jungsung_list.length * @jongsung_list.length) /
                       (@jongsung_list.length) ] + "+"
  #종성출력
  print @jongsung_list[ (unicode - offset) % @jongsung_list.length ] + ")\n"
end

("가".."힣").each{|x| split(x)}

결과

가=(ㄱ+ㅏ+ )
각=(ㄱ+ㅏ+ㄱ)
갂=(ㄱ+ㅏ+ㄲ)
갃=(ㄱ+ㅏ+ㄳ)
간=(ㄱ+ㅏ+ㄴ)
갅=(ㄱ+ㅏ+ㄵ)
갆=(ㄱ+ㅏ+ㄶ)
갇=(ㄱ+ㅏ+ㄷ)
갈=(ㄱ+ㅏ+ㄹ)
갉=(ㄱ+ㅏ+ㄺ)
...
힛=(ㅎ+ㅣ+ㅅ)
힜=(ㅎ+ㅣ+ㅆ)
힝=(ㅎ+ㅣ+ㅇ)
힞=(ㅎ+ㅣ+ㅈ)
힟=(ㅎ+ㅣ+ㅊ)
힠=(ㅎ+ㅣ+ㅋ)
힡=(ㅎ+ㅣ+ㅌ)
힢=(ㅎ+ㅣ+ㅍ)
힣=(ㅎ+ㅣ+ㅎ)