2013-03-01 1 views
1

나는 C#으로 작성된 함수를 가지고 있는데, objective-c로 변환하고 싶다. 그것을하는 방법?IOS - 유니 코드 Unsign

public static string UnicodeUnSign(string s) 
{ 
    const string uniChars = "àáảãạâầấẩẫậăằắẳẵặèéẻẽẹêềếểễệđìíỉĩịòóỏõọôồốổỗộơờớởỡợùúủũụưừứửữựỳýỷỹỵÀÁẢÃẠÂẦẤẨẪẬĂẰẮẲẴẶÈÉẺẼẸÊỀẾỂỄỆĐÌÍỈĨỊÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢÙÚỦŨỤƯỪỨỬỮỰỲÝỶỸỴÂĂĐÔƠƯ"; 
    const string koDauChars = "aaaaaaaaaaaaaaaaaeeeeeeeeeeediiiiiooooooooooooooooouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAAEEEEEEEEEEEDIIIOOOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYYAADOOU"; 

    if (string.IsNullOrEmpty(s)) 
    { 
     return s; 
    } 

    string retVal = String.Empty; 
    for (int i = 0; i < s.Length; i++) 
    { 
     int pos = uniChars.IndexOf(s[i].ToString()); 
     if (pos >= 0) 
      retVal += koDauChars[pos]; 
     else 
      retVal += s[i]; 
    } 
    return retVal; 
} 
+5

내가 첫 번째 단계가 될 것 상상 Objective-C를 배우기 – borrrden

+0

개인적으로 iOS 및 OS X 용 C# 응용 프로그램을 작성하는 데 [Xamarin 스택 도구] (http://xamarin.com/)를 사용하여 매우 좋은 경험을했습니다. –

+0

아니요, 이해가 안됩니다. funct를 변환하고 싶다. 이온 삭제 기호 위, 나는 C#에서 응용 프로그램 네이티브 IOS를 만들고 싶지 않아요. – BlueSky

답변

1

당신은 당신의 목록에서 거의 모든 변환을 수행하는 CoreFoundation에서 CFStringTransform 기능을 사용할 수 있습니다. 전용 "đ"와 "DJ는"개별적으로 처리 할 수있다 :

NSString *UnicodeUnsign(NSString *s) 
{ 
    NSMutableString *result = [s mutableCopy]; 
    // __bridge only required if you compile with ARC: 
    CFStringTransform((__bridge CFMutableStringRef)result, NULL, kCFStringTransformStripCombiningMarks, NO); 

    [result replaceOccurrencesOfString:@"đ" withString:@"d" options:0 range:NSMakeRange(0, [result length])]; 
    [result replaceOccurrencesOfString:@"Đ" withString:@"D" options:0 range:NSMakeRange(0, [result length])]; 

    return result; 
} 

예 :

NSString *input = @"Hễllö Wõrld! - ếểễệđìíỉĩịòó"; 
NSString *output = UnicodeUnsign(input); 
NSLog(@"%@", output); 
// Output: Hello World! - eeeediiiiioo 
+0

Martin : 감사합니다. – BlueSky

+0

@BlueSky : 안녕하세요. –

+1

특별한 취급이 필요하다는 것을 의미하는 Đ와 đ에 특별한 것은 무엇입니까? – JeremyP

2

핵심 재단에 의지하지 않고 :

#import <Foundation/Foundation.h> 

int main (int argc, const char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSString *unicodeCharacters = @"àáảãạâầấẩẫậăằắẳẵặèéẻẽẹêềếểễệđìíỉĩịòóỏõọôồốổỗộơờớởỡợùúủũụưừứửữựỳýỷỹỵÀÁẢÃẠÂẦẤẨẪẬĂẰẮẲẴẶÈÉẺẼẸÊỀẾỂỄỆĐÌÍỈĨỊÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢÙÚỦŨỤƯỪỨỬỮỰỲÝỶỸỴÂĂĐÔƠƯ"; 

    NSString *decomposed = [unicodeCharacters decomposedStringWithCanonicalMapping]; 
    NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 

    NSString *cleaned = [decomposed stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:usLocale]; 
    cleaned = [cleaned stringByReplacingOccurrencesOfString:@"đ" withString:@"d"]; 
    cleaned = [cleaned stringByReplacingOccurrencesOfString:@"Đ" withString:@"D"]; 
    NSLog (@"%@", cleaned); 

    [pool drain]; 
    return 0; 
} 
+1

좋은 답변입니다! 나는'decomposedStringWithCanonicalMapping'에 대해서는 알고 있지만'stringByFoldingWithOptions'에 대해서는 알고 있지 않습니다. - 문자열을 먼저 분해해야합니까? 최소한이 질문의 입력 문자열은 차이가없는 것 같습니다. –

+0

크게 안전주의 사항입니다. 이 모든 것은 문자열의 소스와 텍스트가 일치하도록하려는 경우에 따라 달라집니다. Apple의 QA 기사에 따르면 Mac에서만 독점적으로 사용하는 한 아마 중요하지 않습니다. http://developer.apple.com/library/mac/#qa/qa1235/_index.html –

관련 문제