objective c - NSString: स्ट्रिंग से यूटीएफ-8 एक्सेंट को हटाने का आसान तरीका है?




objective-c utf-8 (6)

मैं एक वाक्य बदलना चाहता हूं, उदाहरण के लिए:

Être ou ne pas être सैटैत ला-बास

बन जाएगा:

इट्रे ओ पास एटर सीटेट ला-बास

क्या NSString के साथ ऐसा करने का कोई आसान तरीका है? या क्या मुझे इसे प्रत्येक खुद की जांच करके खुद को विकसित करना है?


आपने कोशिश की है

[string stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:[NSLocale currentLocale]]

या

Boolean CFStringTransform (
   CFMutableStringRef string,
   CFRange *range,
   CFStringRef transform,
   Boolean reverse
);

?

CFString ट्रांसफॉर्मर और ट्रांसफ़ॉर्म आइडेंटिफ़ार्स

NSMutableString *string = ...;
CFMutableStringRef stringRef = (__bridge CFMutableStringRef)string;
CFStringTransform(stringRef, NULL, kCFStringTransformToLatin, NO);
NSLog(@"%@", string);

सिर्फ एक अद्यतन कहने के लिए कि यह तेजी से ऐसा किया जा सकता है:

"Être ou ne pas être. C'était là-bas.".stringByFoldingWithOptions(NSStringCompareOptions.DiacriticInsensitiveSearch, locale: NSLocale.currentLocale())

-> "इट्रे ओ पास एटर। सीटेट ला-बेस।"


मैट थॉम्पसन ने एनएसएचपीस्टर में और फिर WWDC 2013 सत्र 228 में इसे कवर किया

टी एल; डॉ

NSMutableString *str = [@"Être ou ne pas être. C'était là-bas." mutableCopy];
CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformStripCombiningMarks, NO);

चाल करना चाहिए, यह मेरे लिए महान काम किया

चेतावनी टिप्पणी में बहुत से लोगों का कहना है कि यह स्वीकृत उत्तर होना चाहिए, मैं इस विधि के लिए एक चेतावनी देना चाहता हूं। यह विधि बहुत धीमी गति से है और सावधानी के साथ उपयोग किया जाना चाहिए अगर बड़ी संख्या में स्ट्रिंग / डेटा को परिवर्तित किया जाना चाहिए


यहां पूर्ण कोड है फ़ंक्शन स्ट्रिंगफॉलिगिनविथऑप्ट्स का उपयोग करें

NSString *[email protected]"Être ou ne pas être C'était là-bas"; NSString *str2=[str1 stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:[NSLocale systemLocale]]; NSLog(@"%@",str2);


आईफ़ोन 6 आईओएस 9.0 पर स्विफ्ट 2.0 का इस्तेमाल करते हुए एक प्रदर्शन टेस्ट का उपयोग करके समाधान के बीच सिम्युलेटर:

  • CFStringTransform (टास्क 1)
  • स्ट्रिंगफ़ोल्डिंगविड्थ विकल्प (टास्क 2)

कार्य 2 लगातार तेज है, जैसे:

Task 1 took 9.49736100435257 seconds.
Task 2 took 1.96649599075317 seconds.

यहां परीक्षण:

    let timer = ParkBenchTimer()
    for _ in 1...1000000 {
        let mStringRef = NSMutableString(string: "Être ou ne pas être. C'était là-bas.") as CFMutableStringRef
        CFStringTransform(mStringRef, nil, kCFStringTransformStripCombiningMarks, false)
        String(mStringRef)
    }
    print("Task 1 took \(timer.stop()) seconds.")

    let timer2 = ParkBenchTimer()
    for _ in 1...1000000 {
        "Être ou ne pas être. C'était là-bas.".stringByFoldingWithOptions(NSStringCompareOptions.DiacriticInsensitiveSearch, locale: NSLocale.currentLocale())
    }
    print("Task 2 took \(timer2.stop()) seconds.")

क्लास द्वारा पार्कबेन्च टायमर: https://.com/a/26578191/1097106


NSString *str = @"Être ou ne pas être. C'était là-bas.";
NSData *data = [str dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *newStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@", newStr);

... या इसके बजाय NSUTF8StringEncoding का उपयोग करने का प्रयास करें।

यहाँ एन्कोडिंग प्रकार की सूची:

https://developer.apple.com/documentation/foundation/nsstringencoding

इस महान जवाब को लिखने के लिए सिर्फ एक एफटीआर यहां एक तरह से रास्ता है:

yourString = [[NSString alloc]
  initWithData:
    [yourString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]
  encoding:NSASCIIStringEncoding];




nsstring