Objective c 如何将std::string转换为NSString?

Objective c 如何将std::string转换为NSString?,objective-c,nsstring,objective-c++,stdstring,Objective C,Nsstring,Objective C++,Stdstring,您好,我正在尝试将标准的std::string转换为NSString,但我运气不太好 我可以使用以下代码成功地从NSString转换为std::string NSString *realm = @"Hollywood"; std::string REALM = [realm cStringUsingEncoding:[NSString defaultCStringEncoding]]; 但是,当我尝试以下操作时,会出现编译时错误 NSString *errorMessage = [NSStri

您好,我正在尝试将标准的
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
我是不是遗漏了什么


提前感谢。

从std::string中取出c-string进行转换:

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

首先,您必须使用Objective-C++才能使其发挥最小的作用;确保这一点的最简单方法是将所有
*.m
文件重命名为
*.mm

迄今为止,获得C++(代码> STD::String 到<代码> NString 中最有用的(非弃用)方式是:

std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];
有了它(并适当地导入),您现在可以:

NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
对于std::wstring也一样,这非常方便。

我还发现:

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

像冠军一样工作。

苹果现在有了一种新的方式,他们希望你完成这一转换。在XCode7中,我使用了编辑>转换>到现代Objective C语法。。。选项来找出这一点。它使用速记@符号

NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];
std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());

以下是代码片段/示例:

string str_simple = "HELLO WORLD";

//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                encoding:[NSString defaultCStringEncoding]];            
NSLog(stringinObjC);

这一定是输入错误,但“NSString*realm=“Hollywood”中的字符串文字缺少“@”这似乎不是一个好的答案,正如文档所说:/*依赖于用户的编码,其值是从用户的默认语言和潜在的其他因素派生的。在没有其他提示的情况下,解释具有未知编码的用户文档时,有时可能需要使用此编码。这种编码应该很少使用,如果有的话。请注意,这里的一些潜在值可能会导致对甚至相当简单的NSString内容进行意外的编码转换,例如,使用双向编码的标点符号*/[NSString stringWithUTF8String:mystring.c_str()]似乎更合适,因为std::string更可能来自您自己的代码,这很可能是在UTF8中。你们知道为什么在这里()会显示“返回的对象可能与原始接收方不同”?这意味着什么?我们如何知道它是否不同?@cyrichapier如果我们的.mm文件说“没有指定特定的编码”该怎么办?这是rad,我在几个iphone项目中使用过它。我注意到的一件事是,如果我运行Apple的单元测试框架,并且测试一个使用这些方法的库,我必须在单元测试的“构建阶段”将包含字符串转换方法的文件作为“编译源”之一。是的,单元测试本质上是它自己的小程序,需要访问相同的代码。此外,实际编写测试的荣誉;-)你们知道为什么这里()写着“返回的对象可能与原始接收器不同”吗?这意味着什么?我们如何知道它是否不同?@izzyMachado文档中的这种语言通常意味着他们保留接口契约下的“权利”,以解析、清理或规范化输入字符串。i、 e.它可能不是往返的,并且仍然比较
=
,而是它们可以做出的“最接近”或“最佳”表示。本例中的接收器是
NSString
类实现,返回的值不是Objective-C对象,因此它们也可能使用一些标准语言来覆盖它。您知道当我们使用initWithUTF8String并且字符串包含非utf8字符时,为什么这仍然有效吗?它如何仍然能够使用字符串(如果它是UTF-8),一旦它成为NString就打印出来,这是非常不安全的,不保证工作。Stand字符串如果是STD::String,是C++对象。C++对象对于传递给变量函数是不安全的(可变模板在C++ 11中解决这个问题)。如果它能工作,那是一个侥幸&几乎每个编译器都会至少警告您不要这样做(如果它不是一个错误的话)。这会使NSString变成UTF8吗?或者NSString是什么编码?如果这是一个愚蠢的问题,请原谅,但可以肯定的是,它能保证生成sCPPString.c_str()的副本吗进入SAPPSTRING?我的意思是,如果sCPPString超出了分数,SAPPSTRING中的内存仍然有效?还有一个关于stringWithUTF8String和stringWithCString方法的问题,第一个是复制,另一个只是引用内存缓冲区,还是两者都保证复制?(我知道第一本是复印件,但另一本呢),我只是想确定一下。谢谢。。。
string str_simple = "HELLO WORLD";

//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                encoding:[NSString defaultCStringEncoding]];            
NSLog(stringinObjC);