[Ruby] 한글날 기념 코딩. 한글 자소 분해
치매방지겸 한글날 기념으로 한글 음절을 자소로 분해하는 코딩.
즉 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)}
결과
가=(ㄱ+ㅏ+ ) 각=(ㄱ+ㅏ+ㄱ) 갂=(ㄱ+ㅏ+ㄲ) 갃=(ㄱ+ㅏ+ㄳ) 간=(ㄱ+ㅏ+ㄴ) 갅=(ㄱ+ㅏ+ㄵ) 갆=(ㄱ+ㅏ+ㄶ) 갇=(ㄱ+ㅏ+ㄷ) 갈=(ㄱ+ㅏ+ㄹ) 갉=(ㄱ+ㅏ+ㄺ) ... 힛=(ㅎ+ㅣ+ㅅ) 힜=(ㅎ+ㅣ+ㅆ) 힝=(ㅎ+ㅣ+ㅇ) 힞=(ㅎ+ㅣ+ㅈ) 힟=(ㅎ+ㅣ+ㅊ) 힠=(ㅎ+ㅣ+ㅋ) 힡=(ㅎ+ㅣ+ㅌ) 힢=(ㅎ+ㅣ+ㅍ) 힣=(ㅎ+ㅣ+ㅎ)
