// // 한글 로마자 변환 프로그램 // // 동성... kiding.kmug.co.kr // /* Copyright (C) 2011 by Dongsung "Don" Kim Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // // 프로그램 내부에서 사용하시려면 ARC를 사용하시는 것을 권장합니다. // ARC is highly recommended if this code is implemented in a program. // #import int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *choCharset = @"ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ"; NSString *jungCharset = @"ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ"; NSString *jongCharset = @"+ㄱㄱㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㄷㄷㅋㄷㅂㄷ"; NSString *aString = @"동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세"; NSMutableString *bString = [NSMutableString string]; [bString appendString:@" "]; for (int i=0; i<[aString length]; i++) { // 한글 대역인 경우 치환 unichar aChar = [aString characterAtIndex:i]; if(0xAC00 <= aChar && aChar <= 0xD7AF) { aChar -= 0xAC00; unsigned int choSung = aChar / (21*28); unsigned int jungSung = (aChar % (21*28)) / 28; unsigned int jongSung = (aChar % (21*28)) % 28; [bString appendString:[choCharset substringWithRange:NSMakeRange(choSung, 1)]]; [bString appendString:[jungCharset substringWithRange:NSMakeRange(jungSung, 1)]]; [bString appendString:[jongCharset substringWithRange:NSMakeRange(jongSung, 1)]]; } else [bString appendString:[aString substringWithRange:NSMakeRange(i, 1)]]; } [bString appendString:@" "]; [bString replaceOccurrencesOfString:@"+" withString:@"" options:NSLiteralSearch range:NSMakeRange(0, [bString length])]; // 끝소리 겹자음 NSRange bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㄶㄷ" withString:@"ㄴㅌ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄶㅈ" withString:@"ㄴㅊ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄶㄱ" withString:@"ㄴㅋ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅀㄷ" withString:@"ㄹㅌ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅀㅈ" withString:@"ㄹㅊ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅀㄱ" withString:@"ㄹㅋ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅂㅏㄼㅇ" withString:@"ㅂㅏㄹㅂ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅂㅏㄼ" withString:@"ㅂㅏㅂ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄴㅓㄼㅇ" withString:@"ㄴㅓㄹㅂ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄴㅓㄼㅈ" withString:@"ㄴㅓㅂㅈ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄴㅓㄼㄷ" withString:@"ㄴㅓㅂㄷ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄺㅇ" withString:@"ㄹㄱ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄺㄱ" withString:@"ㄹㄱ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄺ" withString:@"ㄱ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄳㅇ" withString:@"ㄱㅅ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄺ" withString:@"ㄱ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅄㅇ" withString:@"ㅂㅅ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅄ" withString:@"ㅂ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄳㅇ" withString:@"ㄱㅅ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄳ" withString:@"ㄱ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄵㅇ" withString:@"ㄴㄷ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄵ" withString:@"ㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄶㅇ" withString:@"ㄴㅇ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄶ" withString:@"ㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄼㅇ" withString:@"ㄹㅂ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄼㅈ" withString:@"ㅂㅈ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄼ" withString:@"ㄹ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄽㅇ" withString:@"ㄹㅅ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄽ" withString:@"ㄹ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄾㅇ" withString:@"ㄹㄷ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄾ" withString:@"ㄹ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅀㅇ" withString:@"ㄹㅇ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅀ" withString:@"ㄹ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄻㅇ" withString:@"ㄹㅁ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄻ" withString:@"ㅁ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄿㅇ" withString:@"ㄹㅂ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄿ" withString:@"ㅂ" options:NSLiteralSearch range:bStringRange]; // 끝소리 쌍시옷 for(int i=1; i<[bString length]-1; i++) { NSString *thisChar = [bString substringWithRange:NSMakeRange(i, 1)]; if([thisChar isEqualToString:@"ㅆ"]) { NSString *nextChar = [bString substringWithRange:NSMakeRange(i+1, 1)]; if([nextChar isEqualToString:@"ㅇ"]) // 다음 글자가 이응 [bString replaceCharactersInRange:NSMakeRange(i, 2) withString:@"ㅅ"]; else if([choCharset rangeOfString:nextChar].length) [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"ㄷ"]; // 이응 아니면 발음 그대로 } } // 끝소리 시옷 for(int i=1; i<[bString length]-1; i++) { NSString *thisChar = [bString substringWithRange:NSMakeRange(i, 1)]; if([thisChar isEqualToString:@"ㅅ"]) { NSString *nextChar = [bString substringWithRange:NSMakeRange(i+1, 1)]; if([nextChar isEqualToString:@"ㅇ"]) // 다음 글자가 이응 [bString replaceCharactersInRange:NSMakeRange(i, 2) withString:@"ㅅ"]; else if([choCharset rangeOfString:nextChar].length) [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"ㄷ"]; // 이응 아니면 발음 그대로 } } // 자음동화 bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㄱㄴ" withString:@"ㅇㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄱㅁ" withString:@"ㅇㅁ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄷㄴ" withString:@"ㄴㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄷㅁ" withString:@"ㄴㅁ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅂㄴ" withString:@"ㅁㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅂㅁ" withString:@"ㅁㅁ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄱㄹ" withString:@"ㅇㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄷㄹ" withString:@"ㄴㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅂㄹ" withString:@"ㅁㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅁㄹ" withString:@"ㅁㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅇㄹ" withString:@"ㅇㄴ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄹㄴ" withString:@"ㄹㄹ" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄴㄹ" withString:@"ㄹㄹ" options:NSLiteralSearch range:bStringRange]; // 구개음화 제외 // 덧나는 경우: 알약 [bString replaceOccurrencesOfString:@"ㅇㅏㄹㅇㅑㄱ" withString:@"ㅇㅏㄹㄹㅑㄱ" options:NSLiteralSearch range:bStringRange]; // 덧나는 경우: 학여울 [bString replaceOccurrencesOfString:@"ㅎㅏㄱㅇㅕㅇㅜㄹ" withString:@"ㅎㅏㅇㄴㅕㅇㅜㄹ" options:NSLiteralSearch range:bStringRange]; // 첫소리 이응 for(int i=1; i<[bString length]-1; i++) { NSString *thisChar = [bString substringWithRange:NSMakeRange(i, 1)]; if([thisChar isEqualToString:@"ㅇ"]) { NSString *nextChar = [bString substringWithRange:NSMakeRange(i+1, 1)]; if([jungCharset rangeOfString:nextChar].length) // 다음 글자가 모음 [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@""]; } } // 치환: ㄹㄹ bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㄹㄹ" withString:@"ll" options:NSLiteralSearch range:bStringRange]; // 치환: ㄱㄷㅂㄹ: 자음 앞과 어말에서 ktpl, 그 외 gdbr for(int i=1; i<[bString length]-1; i++) { NSString *thisChar = [bString substringWithRange:NSMakeRange(i, 1)]; if([thisChar isEqualToString:@"ㄱ"]) { NSString *nextChar = [bString substringWithRange:NSMakeRange(i+1, 1)]; if([choCharset rangeOfString:nextChar].length) // 다음 글자가 자음 [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"k"]; else if([nextChar isEqualToString:@" "]) // 어말 (다음 글자가 공백) [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"k"]; else // 그 외 [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"g"]; } if([thisChar isEqualToString:@"ㄷ"]) { NSString *nextChar = [bString substringWithRange:NSMakeRange(i+1, 1)]; if([choCharset rangeOfString:nextChar].length) [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"t"]; else if([nextChar isEqualToString:@" "]) [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"t"]; else [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"d"]; } if([thisChar isEqualToString:@"ㅂ"]) { NSString *nextChar = [bString substringWithRange:NSMakeRange(i+1, 1)]; if([choCharset rangeOfString:nextChar].length) [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"p"]; else if([nextChar isEqualToString:@" "]) [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"p"]; else [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"b"]; } if([thisChar isEqualToString:@"ㄹ"]) { NSString *nextChar = [bString substringWithRange:NSMakeRange(i+1, 1)]; if([choCharset rangeOfString:nextChar].length) [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"l"]; else if([nextChar isEqualToString:@" "]) [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"l"]; else [bString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"r"]; } } // 치환: 그 외 bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅏ" withString:@"a" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅓ" withString:@"eo" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅗ" withString:@"o" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅜ" withString:@"u" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅡ" withString:@"eu" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅣ" withString:@"i" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅐ" withString:@"ae" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅔ" withString:@"e" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅚ" withString:@"oe" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅟ" withString:@"wi" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅑ" withString:@"ya" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅕ" withString:@"yeo" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅛ" withString:@"yo" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅠ" withString:@"yu" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅒ" withString:@"yae" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅖ" withString:@"ye" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅘ" withString:@"wa" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅙ" withString:@"wae" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅝ" withString:@"wo" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅞ" withString:@"we" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅢ" withString:@"ui" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㄲ" withString:@"kk" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅋ" withString:@"k" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄸ" withString:@"tt" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅌ" withString:@"t" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅃ" withString:@"pp" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅍ" withString:@"p" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅈ" withString:@"j" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅉ" withString:@"jj" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅊ" withString:@"ch" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅅ" withString:@"s" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅆ" withString:@"s" options:NSLiteralSearch range:bStringRange]; bStringRange = NSMakeRange(0, [bString length]); [bString replaceOccurrencesOfString:@"ㅎ" withString:@"h" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㄴ" withString:@"n" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅁ" withString:@"m" options:NSLiteralSearch range:bStringRange]; [bString replaceOccurrencesOfString:@"ㅇ" withString:@"ng" options:NSLiteralSearch range:bStringRange]; // 앞뒤 자르기 [bString deleteCharactersInRange:NSMakeRange(0, 1)]; [bString deleteCharactersInRange:NSMakeRange([bString length]-1, 1)]; NSLog(@"%@", bString); [pool drain]; return 0; }