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를 구현하면 될 것이다.
기존에 Java에서 사용하던 함수를 ruby로 converting하였다.
Ruby에서는 Built-in Library까지 확장할 수 있으므로, (이런 확장성이 내가 Ruby를 좋아하는 이유다. ^^)
String class를 확장하여서 구현하면 된다. 단 주의할 점은 UTF-8 기준에서 처리되므로
초, 중, 종성 값이 UTF-8 값이어야 하고 (즉, 코드를 저장하는 파일이 UTF-8 형식이어함)
처리할 string도 UTF-8로 인코딩 되어있어야 한다.
이 조건이 되지 않는 경우는, Iconv를 이용해서 Wrapper method를 구현하면 될 것이다.
- class String
- # 한글 초성, 중성, 종성. (UTF-8 이어야 함)
- @@chosung = ['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']
- @@jungsung = ['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ']
- @@jongsung = ['', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']
- # UTF-8 형식의 문자열을 분해한다.
- def separate
- separated = []
- self.unpack('U*').each do c
- n = (c & 0xFFFF).to_i
- # 유니코드 2.0 한글의 범위 : AC00(가) ~ D7A3(힣)
- if n >= 0xAC00 && n <= 0xD7A3
- n = n - 0xAC00
- n1 = n / (21 * 28) # 초성 : '가' ~ '깋' -> 'ㄱ'
- n = n % (21 * 28) # '가' ~ '깋'에서의 순서
- n2 = n / 28; # 중성
- n3 = n % 28; # 종성
- separated << @@chosung[n1] << @@jungsung[n2] << @@jongsung[n3]
- else
- separated << c.to_a.pack('U')
- end
- end
- separated
- end
- end



::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::
여기도. 잘보았습니다.
저기 11번째 줄 do c => do |c| 로 고치셔야 될거 같네요.