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


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.