Std :: স্ট্রিংকে NSString এ রূপান্তর করবেন কীভাবে?


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
এটি অবশ্যই একটি টাইপো হতে পারে তবে আপনি 'এনএসএসটিং * রিয়েলম = "হলিউড" এর স্ট্রিংয়ের জন্য' @ 'মিস করছেন;' লাইন
ভ্লাদিমির

উত্তর:


111

রূপান্তর জন্য স্ট্রিং :: স্ট্রিং এর বাইরে সি-স্ট্রিং পান:

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

এটি কোনও উত্তম উত্তর বলে মনে হচ্ছে না, যেমন ডকুমেন্টেশনে বলা হয়েছে: / * ব্যবহারকারী-নির্ভর এনকোডিং যারা মান দেয় তা ব্যবহারকারীর ডিফল্ট ভাষা এবং সম্ভাব্য অন্যান্য কারণ থেকে উদ্ভূত হয়। অন্যান্য ইঙ্গিতগুলির অনুপস্থিতিতে অজানা এনকোডিংগুলির সাথে ব্যবহারকারীর নথিগুলি ব্যাখ্যা করার সময় এই এনকোডিংটির ব্যবহারের প্রয়োজন হতে পারে। এই এনকোডিংটি খুব কমই ব্যবহার করা উচিত, যদি তা হয়। মনে রাখবেন যে এখানে কিছু সম্ভাব্য মানগুলির ফলে এমনকি মোটামুটি সরল NSString সামগ্রীর অপ্রত্যাশিত এনকোডিং রূপান্তর ঘটতে পারে --- উদাহরণস্বরূপ, একটি দ্বিদ্বিতীয় এনকোডিং সহ বিরামচিহ্নগুলি। * /
সাইরিলচ্যাম্পিয়ার

33
[এনএসএস স্ট্রিং উইথআউটএফ 8 স্ট্রিং: mystring.c_str ()] যেহেতু std :: স্ট্রিংটি সম্ভবত আপনার নিজস্ব কোড থেকে আসছে, সম্ভবত এটি ইউটিএফ 8-তে আসে more
সাইরিলচ্যাম্পিয়ার

আপনি কি জানেন যে এখানে কেন ( ডেভেলপার.অ্যাপল. com/ ডকুমেন্টেশন / ফাউন্ডেশন/nsstring/…) এটি বলে যে "ফিরে আসা বস্তুটি মূল রিসিভারের চেয়ে আলাদা হতে পারে"? এর অর্থ কী এবং এটি আলাদা থাকলে আমরা কীভাবে জানব?
isJulian00

@cyrilchapier যদি আমাদের .mm ফাইলটি "কোনও নির্দিষ্ট এনকোডিং নির্দিষ্ট করে না" বলে থাকে?
isJulian00

54

প্রথমত, সামান্যতম কাজ করার জন্য আপনাকে উদ্দেশ্যমূলক-সি ++ ব্যবহার করতে হবে; আপনার সমস্ত *.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, যা কাজের চেয়ে বেশি।


4
এটি রেড এবং আমি এটি আইফোন প্রকল্পের কয়েকটিতে ব্যবহার করেছি। একটি জিনিস আমি লক্ষ্য করেছি যে আমি যদি অ্যাপলের ইউনিট পরীক্ষার কাঠামোটি চালাচ্ছিলাম এবং আমি এই পদ্ধতিগুলি ব্যবহার করে এমন একটি গ্রন্থাগার পরীক্ষা করছিলাম তবে স্ট্রিং রূপান্তর পদ্ধতি সম্বলিত ফাইলটির জন্য "বিল্ড পর্যায়সমূহ" -এ "সংকলন উত্স" র একটি হিসাবে আমাকে অন্তর্ভুক্ত করতে হবে for ইউনিট পরীক্ষা। অদ্ভুত।
ডেভিড

4
হ্যাঁ, ইউনিট পরীক্ষাটি মূলত এটি নিজস্ব সামান্য প্রোগ্রাম এবং একই কোডটিতে অ্যাক্সেস থাকা দরকার। এছাড়াও, পরীক্ষাগুলি লেখার জন্য
কুডো

4
আপনি কি জানেন যে এখানে কেন ( ডেভেলপার.অ্যাপল. com/ ডকুমেন্টেশন / ফাউন্ডেশন/nsstring/…) এটি বলে যে "ফিরে আসা বস্তুটি মূল রিসিভারের চেয়ে আলাদা হতে পারে"? এর অর্থ কী এবং এটি আলাদা থাকলে আমরা কীভাবে জানব?
isJulian00

4
@izzyMachado দস্তাবেজগুলিতে এই জাতীয় ভাষাটির অর্থ সাধারণত হয় যে তারা ইনপুট স্ট্রিংকে বিশ্লেষণ, স্যানিটাইজ করতে বা ক্যানোনিকালাইজ করার জন্য ইন্টারফেস চুক্তির আওতায় "ডান" সংরক্ষণ করে। উদাহরণস্বরূপ এটি রাউন্ড ট্রিপ না করে এবং এখনও তুলনা ==করতে পারে তবে তারা "নিকটতম" বা তারা করতে পারেন "সেরা" উপস্থাপনা হতে পারে। এই ক্ষেত্রে প্রাপক হ'ল NSStringশ্রেণি বাস্তবায়ন, এবং প্রত্যাবর্তিত মানটি কোনও উদ্দেশ্য-সি অবজেক্ট নয়, তাই তারা কিছু মানক ভাষায় এটিও কভার করতে পারে।
rvalue

আপনি কী জানেন যে কেন আমরা এখনও ইনিউইউডুএফএফ 8 স্ট্রিং ব্যবহার করি এবং স্ট্রিংটিতে ইউটিএফ 8 অক্ষর অন্তর্ভুক্ত থাকে তা কীভাবে এখনও স্ট্রিংটি ব্যবহার করতে সক্ষম হয় (এটি যদি পুদিনা ইউটিএফ -8 থাকে) এবং এটি এনএসটিস্ট্রিং হওয়ার পরে এটি মুদ্রণ করতে পারে?
isululian00

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

এটি কি এনএসএসস্ট্রিং ইউটিএফ 8 তৈরি করে? বা এনএসএসস্ট্রিং কী এনকোডিং হবে?
isululian00

15

অ্যাপল এখন আপনার কাছে এই রূপান্তরটি করতে চান এমন একটি নতুন উপায় রয়েছে। XCode7 এ, আমি এটি সম্পাদনা> রূপান্তর> আধুনিক উদ্দেশ্য সি সিনট্যাক্স ... বিকল্পটি ব্যবহার করেছি out এটি শর্টহ্যান্ড @ প্রতীক ব্যবহার করে।

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

দুঃখিত যদি এটি একটি মূ ?় প্রশ্ন, তবে কেবল নিশ্চিত হওয়া, এসপ্লেস্ট্রিংয়ের ক্ষেত্রে এসসিপিপিএসস্ট্রিং.সি.সিটার () এর একটি অনুলিপি তৈরি করা কি গ্যারান্টিযুক্ত? আমার অর্থ যদি এসসিপিপিএসস্ট্রিং স্কোরের বাইরে চলে যায় তবে এসপ্লেস্ট্রিংয়ের ভিতরে থাকা মেমরিটি কি এখনও বৈধ হবে? এবং স্ট্রিংউইডএফএফ 8 স্ট্রিং এবং স্ট্রিং উইথ সিএস স্ট্রিং পদ্ধতি সম্পর্কে আরও একটি প্রশ্ন, প্রথমটি কি একটি অনুলিপি তৈরি করে এবং অন্যটি কেবল মেমরি বাফারকে বোঝায় বা উভয়ই একটি অনুলিপি তৈরির নিশ্চয়তাযুক্ত? (আমি জানি প্রথমটি একটি অনুলিপি তৈরি করেছে তবে অন্যটির কী আছে), আমি নিশ্চিত হওয়ার জন্য বলছি। ধন্যবাদ ...
ম্যাথনার্ড

3

আমি এটিও পেয়েছি:

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

চ্যাম্পের মতো কাজ করে।


4
এটি বেশ অনিরাপদ এবং কাজের গ্যারান্টিযুক্ত নয়। স্ট্যান্ডার্ড স্ট্রিং যদি একটি স্টাডি :: স্ট্রিং, একটি সি ++ অবজেক্ট। সি ++ অবজেক্টগুলি ভের্যাডিক ফাংশনগুলিতে যাওয়ার জন্য নিরাপদ নয় (ভেরিয়াদিক টেম্পলেটগুলি সি ++ 11 এ এই সমস্যাটি সমাধান করে)। যদি এটি কাজ করে তবে এটি একটি ত্রুটিপূর্ণ এবং প্রায় প্রতিটি সংকলক খুব কমপক্ষে আপনাকে এটি করার বিরুদ্ধে সতর্ক করবে (যদি এটি শুরু করার কোনও ত্রুটি না হয়)।
ভিটালী

3

এখানে কোড স্নিপেট / উদাহরণ:

string str_simple = "HELLO WORLD";

//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                encoding:[NSString defaultCStringEncoding]];            
NSLog(stringinObjC);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.