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