NSString में std :: string कैसे कन्वर्ट करें?


97

नमस्ते, मैं एक मानक std::stringमें बदलने की कोशिश कर NSStringरहा हूं, लेकिन मुझे बहुत किस्मत नहीं मिल रही है।

मैं निम्नलिखित कोड के साथ NSStringएक से सफलतापूर्वक परिवर्तित कर सकता हूंstd::string

NSString *realm = @"Hollywood";
std::string REALM = [realm cStringUsingEncoding:[NSString defaultCStringEncoding]];

हालांकि, जब मैं निम्नलिखित प्रयास करता हूं तो मुझे एक संकलन समय त्रुटि मिलती है

NSString *errorMessage = [NSString stringWithCString:REALM encoding:[NSString defaultCStringEncoding]];

मुझे जो त्रुटि मिली है

Cannot convert 'std::string' to 'const char*' in argument passing

क्या मुझसे कोई चूक हो रही है?

अग्रिम में धन्यवाद।


4
यह एक टाइपो होना चाहिए, लेकिन आप 'NSString * दायरे = "हॉलीवुड" में स्ट्रिंग शाब्दिक के लिए' @ 'याद कर रहे हैं; " लाइन।
व्लादिमीर

जवाबों:


111

Cd-string को std से बाहर निकालें :: string for रूपांतरण:

NSString *errorMessage = [NSString stringWithCString:REALM.c_str() 
                                   encoding:[NSString defaultCStringEncoding]];

यह एक अच्छा जवाब नहीं लगता है, जैसा कि प्रलेखन कहता है: / * उपयोगकर्ता-निर्भर एन्कोडिंग, जो उपयोगकर्ता की डिफ़ॉल्ट भाषा और संभावित अन्य कारकों से प्राप्त होती है। इस एन्कोडिंग के उपयोग की आवश्यकता कभी-कभी तब हो सकती है जब अन्य संकेत के अभाव में अज्ञात दस्तावेजों के साथ उपयोगकर्ता दस्तावेजों की व्याख्या की जाए। इस एन्कोडिंग का उपयोग शायद ही कभी किया जाना चाहिए, यदि बिल्कुल। ध्यान दें कि यहाँ कुछ संभावित मूल्यों का परिणाम अप्रत्याशित रूप से सीधे एनएसएसट्रिंग सामग्री के अप्रत्याशित एन्कोडिंग रूपांतरण हो सकता है --- उदाहरण के लिए, एक द्विदिश एन्कोडिंग के साथ विराम चिह्न वर्ण। * /
cyrilchampier

31
[NSString stringWithUTF8String: mysteryring.c_str ()] अधिक उचित लगता है, क्योंकि std :: string आपके अपने कोड से आने की अधिक संभावना है, जो UTF8 में होने की संभावना है।
साइरिलचैम्पियर

क्या आप लोग जानते हैं कि यहाँ पर क्यों ( developer.apple.com/documentation/foundation/nsstring/… ) यह कहता है कि "लौटी हुई वस्तु मूल रिसीवर से अलग हो सकती है"? इसका क्या मतलब है और अगर यह अलग है तो हमें कैसे पता चलेगा?
.Julian00

@cyrilchapier क्या होगा अगर हमारी .mm फ़ाइल "कोई विशिष्ट एन्कोडिंग निर्दिष्ट" नहीं है?
isJulian00

54

सबसे पहले, आप इसे मामूली में काम करने के लिए Objective-C ++ का उपयोग कर रहे हैं; यह सुनिश्चित करने का सबसे आसान तरीका है कि आपकी सभी *.mफ़ाइलों का नाम बदल दिया जाए*.mm

अब तक का सबसे उपयोगी तक (गैर हटा दिया गया) एक सी ++ होने का मैनुअल तरीका std::stringएक में NSStringसाथ है:

std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];

यह ज्यादातर मामलों में काम करेगा - और यदि आप विशिष्ट एन्कोडिंग का पता लगाने और रूपांतरण नहीं कर रहे हैं, तो यूटीएफ -8 आपको गैर-लैटिन वर्णों के लिए एक अच्छा परिणाम देने जा रहा है।

यदि आप एक बड़ा ऐप बना रहे हैं, या आप इस पर काम करने वाले एकमात्र व्यक्ति नहीं हैं, हालाँकि - आप शायद ऐसा कुछ चाहते हैं जो लागू करना आसान हो।

कोको-देव मेलिंग सूची अभिलेखागार से अनुकूलित

@interface NSString (cppstring_additions)
+(NSString*) stringWithwstring:(const std::wstring&)string;
+(NSString*) stringWithstring:(const std::string&)string;
-(std::wstring) getwstring;
-(std::string) getstring;
@end

@implementation NSString (cppstring_additions)

#if TARGET_RT_BIG_ENDIAN
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32BE);
#else
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32LE);
#endif

+(NSString*) stringWithwstring:(const std::wstring&)ws
{
    char* data = (char*)ws.data();
    unsigned size = ws.size() * sizeof(wchar_t);

    NSString* result = [[NSString alloc] initWithBytes:data length:size encoding:kEncoding_wchar_t];
    return result;
}
+(NSString*) stringWithstring:(const std::string&)s
{
    NSString* result = [[NSString alloc] initWithUTF8String:s.c_str()];
    return result;
}

-(std::wstring) getwstring
{
    NSData* asData = [self dataUsingEncoding:kEncoding_wchar_t];
    return std::wstring((wchar_t*)[asData bytes], [asData length] / sizeof(wchar_t));
}
-(std::string) getstring
{
    return [self UTF8String];
}

@end

उस स्थान पर (और उचित रूप से #import) अब आप कर सकते हैं:

NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];

और उसी के लिए std::wstring, जो काम से ज्यादा है।


1
यह रेड है और मैंने इसे एक-दो iPhone प्रोजेक्ट्स में इस्तेमाल किया है। एक बात जो मैंने देखी, वह यह थी कि अगर मैं ऐप्पल की यूनिट टेस्ट फ्रेमवर्क चला रहा था और मैं एक लाइब्रेरी का परीक्षण कर रहा था, तो इन विधियों का उपयोग करने के लिए मुझे स्ट्रिंग रूपांतरण विधियों वाली फाइल को "कंपाइल सोर्स" के रूप में "बिल्ड चरणों" में शामिल करना था। इकाई परीक्षण। अजीब।
डेविड

1
हां, इकाई परीक्षण अनिवार्य रूप से यह अपना छोटा कार्यक्रम है, और उसी कोड तक पहुंच की आवश्यकता है। इसके अलावा, वास्तव में परीक्षण लिखने के लिए यश ;-)
जुलाब

1
क्या आप लोग जानते हैं कि यहाँ पर क्यों ( developer.apple.com/documentation/foundation/nsstring/… ) यह कहता है कि "लौटी हुई वस्तु मूल रिसीवर से अलग हो सकती है"? इसका क्या मतलब है और अगर यह अलग है तो हमें कैसे पता चलेगा?
.Julian00

1
@izzyMachado दस्तावेजों में उस तरह की भाषा का अर्थ है कि वे इनपुट स्ट्रिंग को पार्स, सैनिटाइज या कैनोनिकलाइज़ करने के लिए इंटरफ़ेस अनुबंध के तहत "सही" आरक्षित करते हैं। इसका मतलब यह नहीं हो सकता है कि वह गोल-गोल न हो और फिर भी तुलना करे, ==लेकिन या तो "निकटतम" या "सर्वश्रेष्ठ" प्रतिनिधित्व करें जो वे कर सकते हैं। इस मामले में रिसीवर NSStringवर्ग कार्यान्वयन है, और लौटाया गया मूल्य एक उद्देश्य-सी वस्तु नहीं है, इसलिए वे इसे किसी भी मानक भाषा के साथ कवर कर सकते हैं।
प्रातः

क्या आप जानते हैं कि यह तब भी क्यों काम करता है जब हम initWithUTF8String का उपयोग करते हैं और स्ट्रिंग में गैर utf8 वर्ण शामिल हैं, यह अभी भी स्ट्रिंग का उपयोग कैसे कर सकता है (यदि यह टकसाल UTF-8 है) और इसे NSString होने के लिए एक बार प्रिंट कर लें?
isJulian00

21
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];

क्या यह NSString UTF8 बनाता है? या एनएसएसट्रिंग क्या एन्कोडिंग होगा?

14

Apple के पास अब एक नया तरीका है जो वे चाहते हैं कि आप इस रूपांतरण को करें। XCode7 में, मैंने इसका पता लगाने के लिए Edit> Convert> To Modern Objective C Syntax ... विकल्प का उपयोग किया। यह एक शॉर्टहैंड @ प्रतीक का उपयोग करता है।

std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());

3

मैंने यह भी पाया है कि:

NSString *nsString = [NSString stringWithFormat:@"%s",standardString];

चंपा की तरह काम करता है।


3
यह बहुत असुरक्षित है और काम करने की गारंटी नहीं है। standardString यदि एक std :: string, एक C ++ ऑब्जेक्ट है। C ++ ऑब्जेक्ट्स वैरेडिक फ़ंक्शंस में जाने के लिए सुरक्षित नहीं हैं (Varadic टेम्प्लेट C ++ 11 में इस समस्या को हल करते हैं)। यदि यह काम करता है तो यह एक अस्थायी है और लगभग हर संकलक आपको ऐसा करने के खिलाफ बहुत कम से कम चेतावनी देगा (यदि यह शुरू होने में कोई त्रुटि नहीं है)।
विटाली

3

यहाँ कोड स्निपेट / उदाहरण दिया गया है:

string str_simple = "HELLO WORLD";

//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                encoding:[NSString defaultCStringEncoding]];            
NSLog(stringinObjC);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.