как мне преобразовать nsstring в std :: string?

<p>у меня есть объект <code>nsstring</code> и я хочу преобразовать его в <code>std::string</code>.</p><p>как мне сделать это в objective-c++?</p>

<pre><code>nsstring *foo = @"foo"; std::string bar = std::string([foo utf8string]); </code></pre><p>правка: через несколько лет позвольте мне расширить этот ответ. как справедливо указано, вы, скорее всего, захотите использовать <code>cstringusingencoding:</code> с <code>nsasciistringencoding</code>, если собираетесь использовать <code>std::string</code>. вы можете использовать utf-8 с обычным <code>std::strings</code>, но имейте в виду, что они работают с байтами, а не с символами или даже графемами. для хорошего начала работы, проверьте это <a href="https://stackoverflow.com/questions/3011082/c-stdstring-and-utf-8">вопрос и ответ</a> .</p><p>также обратите внимание, что если у вас есть строка, которая не может быть представлена как ascii, но вы все еще хотите, чтобы она была в <code>std::string</code>, и вы не хотите, чтобы там были символы не-ascii, вы можете использовать <code>datausingencoding:allowlossyconversion:</code>, чтобы получить <code>nsdata</code> представление строки с содержимым в кодировке ascii с потерями, а затем добавьте его в свой <code>std::string</code></p>

<p>как предложил ynau в комментарии, в общем случае было бы лучше хранить все в стеке, а не в куче (использование <code>new</code> создает строку в куче), следовательно (при условии кодировки utf8):</p><pre><code>nsstring *foo = @"foo"; std::string bar([foo utf8string]); </code></pre>

<p>как отмечено на <a href="http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++">philjordan.e</a> , также может быть, что строка nsstring - <code>nil</code>. в таком случае приведение должно быть сделано так:</p><blockquote> <p>// примечание: если foo равен nil, это приведет к пустой строке c++</p> <p>// вместо разыменования пустого указателя из utf8string.</p> </blockquote><p>это привело бы вас к такому преобразованию:</p><pre><code>nsstring *foo = @"foo"; std::string bar = std::string([foo utf8string], [foo lengthofbytesusingencoding:nsutf8stringencoding]); </code></pre>