[Objective-C] 한글의 초성, 중성, 종성 분리하기

유니코드 한글의 코드 값 구성 원리와 이를 토대로 각 음절의 초/중/종성을 분리하는 방법은 강호경님의 블로그에 자세하게 나와있으니, 여기서는 자세한 설명을 생략한다.

위 블로그의 내용을 토대로 클래스를 하나 만들어 초성, 중성, 종성을 추출하는 클래스 메소드를 가진 클래스를 하나 작성하고 이를 사용하여 입력된 파라미터로부터 한글의 초성을 뽑아 뱉어주는 명령줄 도구를 작성한 것이다.

소스코드 다운로드 : http://www.box.com/s/mxmoq5vc3ii5z5di5op2

이전 글에서 사용한 애플 스크립트는 이 명령줄 도구를 애플 스크립트에서 호출하여 이름 필드 값의 초성을 추출하여 이를 별명 필드에 입력하고 저장하는 내용이다. 아이폰은 spotlight 검색이나 주소록 앱에서 검색 시 별명 필드를 검색하므로, 이를 통해 초성 검색 기능을 이용할 수 있다.

//
// hangulSound.h
// firstcode
//
// Created by BONGSOO KWON on 12. 1. 31..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface hangulSound : NSObject
+(NSString *)firstSoundWithString:(NSString *)hangul;
+(NSString *)middleSoundWithString:(NSString *)hangul;
+(NSString *)lastSoundWithString:(NSString *)hangul;
@end

view raw
hangulSound.h
hosted with ❤ by GitHub

//
// hangulSound.m
// firstcode
//
// Created by BONGSOO KWON on 12. 1. 31..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import "hangulSound.h"
@implementation hangulSound
+(NSString *)initSoundWithString:(NSString *)hangul
{
NSString *result = @"";
int i;
for (i=0; i<[hangul length]; i++) {
unichar oneChar = [hangul characterAtIndex:i];
if (oneChar >= 0xAC00 && oneChar <= 0xD7A3) {
int firstCodeValue = ((oneChar – 0xAC00)/28)/21;
firstCodeValue += 0x1100;
result = [result stringByAppendingString:
[NSString stringWithFormat:@"%C", firstCodeValue]];
}
}
return result;
}
+(NSString *)middleSoundWithString:(NSString *)hangul
{
NSString *result = @"";
int i;
for (i=0; i<[hangul length]; i++) {
unichar oneChar = [hangul characterAtIndex:i];
if (oneChar >= 0xAC00 && oneChar <= 0xD7A3) {
int firstCodeValue = ((oneChar – 0xAC00)/28)%21;
firstCodeValue += 0x1161;
result = [result stringByAppendingString:
[NSString stringWithFormat:@"%C", firstCodeValue]];
}
}
return result;
}
+(NSString *)lastSoundWithString:(id)hangul
{
NSString *result = @"";
int i;
for (i=0; i<[hangul length]; i++) {
unichar oneChar = [hangul characterAtIndex:i];
if (oneChar >= 0xAC00 && oneChar <= 0xD7A3) {
int firstCodeValue = (oneChar – 0xAC00)%28;
firstCodeValue += 0x11A7;
result = [result stringByAppendingString:
[NSString stringWithFormat:@"%C", firstCodeValue]];
}
}
return result;
}
@end

view raw
hangulSound.m
hosted with ❤ by GitHub

//
// main.m
// firstcode
//
// Created by BONGSOO KWON on 12. 1. 31..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "hangulSound.h"
int main (int argc, const char * argv[])
{
@autoreleasepool {
// insert code here…
// argc는 파라미터의 개수를 의미. 항상 1보다 크다. (첫 번째 파라미터는 파일 자신의 경로)
if (argc < 2) {
// 파라미터가 들어오지 않았음
printf("USAGE : firstcode <str>\n");
} else {
NSString *result = @"";
for (int i=1;i<argc;i++){
result = [NSString stringWithFormat:@"%@%@", result,
[NSString stringWithUTF8String:argv[i]]];
}
result = [hangulSound firstSoundWithString:result];
printf("%s\n",[result UTF8String]);
}
}
return 0;
}

view raw
main.mm
hosted with ❤ by GitHub