मैं एक NSString को std :: string में कैसे बदलूं?


94

मेरे पास एक NSStringवस्तु है और मैं इसे एक में बदलना चाहता हूं std::string

मैं इसे ऑब्जेक्टिव-सी ++ में कैसे करूं?


का शिकार stackoverflow.com/q/3552195/918764
rvalue

4
@ डुप्लिकेट नहीं एक डुप्लिकेट - बस विपरीत रूपांतरण।
इरिक

जवाबों:


134
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String]);

संपादित करें: कुछ वर्षों के बाद, मुझे इस उत्तर पर विस्तार करने दें। के रूप में हक ने कहा, आप सबसे अधिक संभावना का उपयोग करना चाहेंगे cStringUsingEncoding:के साथ NSASCIIStringEncodingकरता है, तो आप उपयोग कर खत्म करने जा रहे हैं std::string। आप सामान्य के साथ UTF-8 का उपयोग कर सकते हैं std::strings, लेकिन ध्यान रखें कि वे बाइट्स पर काम करते हैं और पात्रों या यहां तक ​​कि अंगूर पर भी नहीं। एक अच्छी "शुरुआत" के लिए, इस प्रश्न और इसके उत्तर की जाँच करें ।

यह भी ध्यान दें, यदि आपके पास एक स्ट्रिंग है जिसे ASCII के रूप में प्रस्तुत नहीं किया जा सकता है, लेकिन आप अभी भी इसे चाहते हैं std::stringऔर आप गैर-ASCII वर्ण नहीं चाहते हैं, तो आप हानिरहित एन्कोडेड ASCII के साथ स्ट्रिंग का प्रतिनिधित्व dataUsingEncoding:allowLossyConversion:प्राप्त करने के लिए उपयोग कर सकते हैं NSDataसामग्री, और फिर अपने पर फेंक दोstd::string


13
एन्कोडिंग के लिए सावधान। जबकि UTF-8 आम तौर पर एक अच्छा विकल्प है, अगर एपीआई आप एक्सपेक्ट्स के साथ काम कर रहे हैं, तो कहें, शुद्ध ASCII या सिस्टम कोडपेज, आपको -cStringUsingEncoding:इसके बजाय उपयोग करना होगा। :)
जोनाथन ग्रिप्सन 20

13
यह एक स्मृति रिसाव है यदि आप इसे हटाते नहीं हैं, तो लौटा हुआ पॉइंटर एक ऑब्जेक्टिव-सी रेफरेंस काउंटेड ऑब्जेक्ट नहीं है। सामान्य तौर पर आपको std :: string के लिए ऑपरेटर के नए प्रयोग से बचना चाहिए।
स्यामकिलास

यह स्वीकृत उत्तर नहीं होना चाहिए और निश्चित रूप से उस रूपांतरण को करते समय विचार करने वाली पहली बात नहीं होनी चाहिए।
जेबीएल

@ जेबीएल केवल 4 साल और कुछ हफ्तों के बाद मैं अपने जवाब का विस्तार करने के लिए घूम गया। मुझे उम्मीद है कि अब यह अधिक स्वीकार्य है।
जस्टसिड

@ जस्टसाइड में मुझे अपनी राय को पहले से निर्धारित करना चाहिए था, लेकिन दूसरा मुद्दा डिफ़ॉल्ट रूप से एक पॉइंटर का उपयोग है। तथ्य की बात के रूप में, एक सहकर्मी एक ओबर्ज बैकग्राउंड वाला, जिसमें कोई C ++ ज्ञान नहीं था, बिना डिलीट किए, एक मेमोरी लीक में समाप्त हो गया। और अधिक आम तौर पर; जंगली newरों पर सिकोड़ी रहे हैं, और एक std::shared_ptrया std::unique_ptrप्राथमिकता दी जानी चाहिए।
जेबीएल

50

जैसा कि यन्नू ने टिप्पणी में सुझाव दिया है, एक सामान्य मामले में यह सब कुछ ढेर के बजाय ढेर पर रखना बेहतर होगा (उपयोग newढेर पर स्ट्रिंग बनाता है), इसलिए (UTF8 एन्कोडिंग को संभालने):

NSString *foo = @"Foo";
std::string bar([foo UTF8String]);

8

जैसा कि दार्ज़र्डन पर उल्लेख किया गया था। यह भी हो सकता है कि NSString है nil। ऐसे में कलाकारों को इस तरह किया जाना चाहिए:

// नोट: अगर फू शून्य है तो यह एक खाली C ++ स्ट्रिंग का उत्पादन करेगा

// इसके बजाय UTF8String से NULL पॉइंटर को डीफ़र करने के बजाय।

यह आपको इस तरह के रूपांतरण की ओर ले जाएगा:

NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);

1
यह काफी उपयोगी है। लगभग हर कोई इसे देखने की चिंता कर रहा है। एनआईएल पर Y'all गोना दुर्घटना।
पी आई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.