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