আমি কীভাবে একটি এনএসএসস্ট্রিংকে একটি এসটিডি :: স্ট্রিংয়ে রূপান্তর করব?


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। আপনি সাধারণ সহ ইউটিএফ -8 ব্যবহার করতে পারেন std::stringsতবে মনে রাখবেন যে এগুলি বাইটগুলিতে এবং না অক্ষর বা এমনকি গ্রাফিমগুলিতে চালিত হয়। ভাল "শুরু" করার জন্য, এই প্রশ্ন এবং এর উত্তরটি দেখুন ।

আরও মনে রাখবেন, আপনার যদি এমন একটি স্ট্রিং থাকে যা ASCII হিসাবে উপস্থাপন করা যায় না তবে আপনি এটি এখনও একটিতে চান std::stringএবং আপনি সেখানে অ-এএসসিআইআই অক্ষর চান না, আপনি ক্ষতিকারক এনকোডযুক্ত ASCII সহ স্ট্রিংটির উপস্থাপনা dataUsingEncoding:allowLossyConversion:পেতে ব্যবহার করতে পারেন NSDataসামগ্রী এবং তারপরে আপনার এটিকে নিক্ষেপ করুনstd::string


13
এনকোডিং যত্নবান। যদিও ইউটিএফ -8 সাধারণত একটি ভাল পছন্দ, আপনি যে এপিআই নিয়ে কাজ করছেন এটি যদি প্রত্যাশা করে, বলুন, খাঁটি এএসসিআইআই বা সিস্টেম কোডপেজ, তবে আপনাকে তার -cStringUsingEncoding:পরিবর্তে ব্যবহার করতে হবে। :)
— জোনাথন গ্রিনস্পান

13
এটি মুছে ফেলা না হলে এটি একটি মেমরি ফাঁস, প্রত্যাবর্তিত পয়েন্টারটি কোনও উদ্দেশ্য-সি রেফারেন্স গণনা করা অবজেক্ট নয়। সাধারণভাবে আপনার স্টাডি :: স্ট্রিংয়ের জন্য অপারেটর নতুন ব্যবহার করা এড়ানো উচিত।
— সিমকাল্লাস

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয় এবং সেই রূপান্তরটি করার সময় অবশ্যই প্রথমে বিবেচনা করা উচিত নয়।
— জেবিএল

@ জেবিএল মাত্র 4 বছর এবং কয়েক সপ্তাহ পরে আমি আমার উত্তরটি প্রসারিত করতে ঘুরেছিলাম। আমি আশা করি এটি এখন আরও গ্রহণযোগ্য।
— জাস্টসিড

@ জাস্টসিডে আমার মতামতটি সংক্ষিপ্ত করা উচিত ছিল, তবে অন্য সমস্যাটি হ'ল ডিফল্টরূপে পয়েন্টার ব্যবহার। প্রকৃতপক্ষে, ওবিজেসি ব্যাকগ্রাউন্ড সহ একজন সহকর্মী, কোনও সি ++ জ্ঞান ছাড়াই মেমরি ফাঁস না করে মোছা ছাড়াই ব্যবহার করেননি। এবং আরও সাধারণভাবে; বন্য newগুলি উপর frowned হয়, এবং একটি std::shared_ptrবা std::unique_ptrপছন্দ করা উচিত।
— জেবিএল

50

মন্তব্য হিসাবে ইন্নোর পরামর্শ অনুসারে, একটি সাধারণ ক্ষেত্রে গাদাের পরিবর্তে (স্তূপের newস্ট্রিং তৈরি করে) সমস্ত কিছু স্ট্যাকের উপরে রাখাই ভাল , সুতরাং (ইউটিএফ 8 এনকোডিং ধরে নিলে):

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

8

ফিলজর্দান.ইউ- তে উল্লিখিত হিসাবে এটি এনএসএসস্ট্রিংও হতে পারে nil। সেক্ষেত্রে castালাই এভাবে করা উচিত:

// দ্রষ্টব্য: যদি foo শূন্য থাকে তবে এটি একটি খালি সি ++ স্ট্রিং তৈরি করবে

// ইউটিএফ 8 স্ট্রিং থেকে NULL পয়েন্টারটিকে ডিফারেন্স করার পরিবর্তে।

এটি আপনাকে এ জাতীয় রূপান্তর করতে পরিচালিত করবে:

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

4
এটি দুর্দান্তভাবে কার্যকর। প্রায় প্রত্যেকে দেখার জন্য চিন্তিত এটি এড়িয়ে চলেছে। আপনার সমস্ত শৃঙ্খলা নীল নষ্ট হয়ে গেছে।
— পি i
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.