출처 : ㅠㅠ 잊어버렸습니다.


인터넷에서 유니코드 한글 위치와 초성 중성 종성을 찾는 알고리즘을 찾았는데 브라우져를 꺼버렸네요 ㅠㅠ
암튼 위의 이미지를 참조해서 아이폰에서 사용할 요량으로 만들어 봤습니다.
알고리즘에 오타 문제가 있습니다.
초성부분에 int((strCode - 0xAC00) / 28 * 21) 이라고 했는데 "28*21" 부분을 "(28*21)" 괄호로 묶어줘야 합니다.
//ChosungUtil.h
#define HANGUL_START_CODE   0xAC00
#define HANGUL_END_CODE     0xD79F

@interface ChosungUtil : NSObject
{
    NSArray *chosung;
    NSArray *jungsung;
    NSArray *jongsung;
}

@property (nonatomic, retain) NSArray *chosung;
@property (nonatomic, retain) NSArray *jungsung;
@property (nonatomic, retain) NSArray *jongsung;

// 입력문자열를 초성과 비교해서 NSComparisonResult를 반환한다.
- (NSComparisonResult) compare:(NSString *)source withChoungString:(NSString *)search;
// 입력문자열을 초성으로 변환시킨다.
- (NSString*) stringChosung:(NSString *) source; 

@end

//ChosungUtil.m
#import "ChosungUtil.h"

@implementation ChosungUtil

@synthesize chosung, jungsung, jongsung;


- (NSComparisonResult) compare:(NSString *)source withChoungString:(NSString *)search
{
    return [[self stringChosung:source] compare:search];
}

- (NSString*) stringChosung:(NSString *) source
{
    NSMutableString *result = [NSMutableString string];
    
    for (NSUInteger i = 0; i < [source length]; i++) {
        NSInteger unicodeChar = [source characterAtIndex:i];
        
        // 한글인지 검색
        if ( HANGUL_START_CODE <= unicodeChar && unicodeChar <= HANGUL_END_CODE )
        {
            NSInteger chosungIndex  = (NSInteger)((unicodeChar - HANGUL_START_CODE) / (28*21));
            // 중성, 종성은 현재 필요없다.
            //            NSInteger jungsungIndex = (NSInteger)((unicodeChar - HANGUL_START_CODE) % (28*21) / 28);
            //            NSInteger jongsungIndex = (NSInteger)((unicodeChar - HANGUL_START_CODE) % 28);
            
            [result appendFormat:@"%@", [chosung objectAtIndex:chosungIndex]];
        }
        
    }
    
    return result;
}


-(id)init
{
    self = [super init];
    if ( self != nil )
    {
        // 초기화 
        chosung = [[NSArray arrayWithObjects:
                   @"ㄱ",@"ㄲ",@"ㄴ",@"ㄷ",@"ㄸ",@"ㄹ",@"ㅁ",
                   @"ㅂ",@"ㅃ",@"ㅅ",@"ㅆ",@"ㅇ",@"ㅈ",@"ㅉ",
                   @"ㅊ",@"ㅋ",@"ㅌ",@"ㅍ",@"ㅎ",nil] retain];

        jungsung = [[NSArray arrayWithObjects:
                     @"ㅏ",@"ㅐ",@"ㅑ",@"ㅒ",@"ㅓ",@"ㅔ",
                     @"ㅕ",@"ㅖ",@"ㅗ",@"ㅘ",@"ㅙ",@"ㅚ",
                     @"ㅛ",@"ㅜ",@"ㅝ",@"ㅞ",@"ㅟ",@"ㅠ",
                     @"ㅡ",@"ㅢ",@"ㅣ",nil] retain];
        jongsung = [[NSArray arrayWithObjects:
                     @"",@"ㄱ",@"ㄲ",@"ㄳ",@"ㄴ",@"ㄵ",@"ㄶ",
                     @"ㄷ",@"ㄹ",@"ㄺ",@"ㄻ",@"ㄼ",@"ㄽ",@"ㄾ",
                     @"ㄿ",@"ㅀ",@"ㅁ",@"ㅂ",@"ㅄ",@"ㅅ",@"ㅆ",
                     @"ㅇ",@"ㅈ",@"ㅊ",@"ㅋ",@" ㅌ",@"ㅍ",@"ㅎ",nil] retain];     
    }
    
    return self;
}


-(void)dealloc
{
    [chosung release];
    [jungsung release];
    [jongsung release];
    
    [super dealloc];
}

@end



//사용방법
-(IBAction)clickedButton:(id)sender 
{
    NSLog(@"%@", hangulField.text);
    
    ChosungUtil *util = [[[ChosungUtil alloc] init] autorelease];
    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"변환결과" 
                                                    message:[util stringChosung:hangulField.text] 
                                                   delegate:self
                                           cancelButtonTitle:nil 
                                          otherButtonTitles:@"닫기", nil];
    [alert show];
    [alert release];
}




 
posted by 뚱2