'한글자소분리'에 해당되는 글 1건

  1. [2006/11/23] Ruby에서 한글 자소 분리 (초성, 중성, 종성) (1)

Ruby에서 한글 자소 분리 (초성, 중성, 종성)

[Development]
Ruby에서 UTF-8 형식의 한글을 자소를 분리할 일이 생겨서,
기존에 Java에서 사용하던 함수를 ruby로 converting하였다.

Ruby에서는 Built-in Library까지 확장할 수 있으므로, (이런 확장성이 내가 Ruby를 좋아하는 이유다. ^^)
String class를 확장하여서 구현하면 된다. 단 주의할 점은 UTF-8 기준에서 처리되므로
초, 중, 종성 값이 UTF-8 값이어야 하고 (즉, 코드를 저장하는 파일이 UTF-8 형식이어함)
처리할 string도 UTF-8로 인코딩 되어있어야 한다.

이 조건이 되지 않는 경우는, Iconv를 이용해서 Wrapper method를 구현하면 될 것이다.
  1. class String
  2.   # 한글 초성, 중성, 종성. (UTF-8 이어야 함)
  3.   @@chosung = ['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']
  4.   @@jungsung = ['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ']
  5.   @@jongsung = ['', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']
  6.   # UTF-8 형식의 문자열을 분해한다. 
  7.   def separate
  8.     separated = []
  9.    
  10.     self.unpack('U*').each do c
  11.       n = (c & 0xFFFF).to_i
  12.      
  13.       # 유니코드 2.0 한글의 범위 : AC00(가) ~ D7A3(힣)
  14.       if n >= 0xAC00 && n <= 0xD7A3
  15.         n = n - 0xAC00
  16.         n1 = n / (21 * 28)  # 초성 : '가' ~ '깋' -> 'ㄱ'
  17.         n = n % (21 * 28)  # '가' ~ '깋'에서의 순서
  18.         n2 = n / 28;    # 중성
  19.         n3 = n % 28;    # 종성
  20.        
  21.         separated << @@chosung[n1] << @@jungsung[n2] << @@jongsung[n3]
  22.       else
  23.         separated << c.to_a.pack('U')
  24.       end
  25.     end 
  26.    
  27.     separated
  28.   end
  29. end
 
2006/11/23 19:43 2006/11/23 19:43