NSStringをstd :: stringに変換するにはどうすればよいですか?


回答:


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

編集:数年後、この答えについて詳しく説明しましょう。正しく指摘されているように、最終的にを使用cStringUsingEncoding:するNSASCIIStringEncoding場合は、を使用することをお勧めしますstd::string。UTF-8を通常std::stringsので使用できますが、UTF-8は文字や書記素ではなくバイトで動作することに注意してください。「はじめに」については、この質問とその回答を確認してください。

また、ASCIIとして表現できない文字列があり、それをそのstd::string中に含めたいが、そこに非ASCII文字を含めたくない場合は、損失のあるエンコードされたASCIIを含む文字列の表現dataUsingEncoding:allowLossyConversion:を取得するために使用できます。NSDataコンテンツ、そしてあなたにそれを投げますstd::string


13
エンコーディングに注意してください。一般的にUTF-8が適切な選択ですが、使用しているAPIが純粋なASCIIまたはシステムコードページなどを想定している場合は、-cStringUsingEncoding:代わりに使用する必要があります。:)
ジョナサン・グリンスパン

13
これを削除しないとメモリリークが発生し、返されるポインタはObjective-Cの参照カウントオブジェクトではありません。一般に、std :: stringには演算子newを使用しないでください。
SiimKallas 2014年

これは受け入れられる答えではなく、その変換を行う際に最初に検討すべきことでもありません。
JBL 2016年

@JBLほんの4年と数週間後、私は私の答えを広げるために行きました。私はそれが今もっと受け入れられることを望みます。
JustSid 2016年

@JustSid私は自分の意見を正確にすべきでしたが、他の問題はデフォルトでのポインタの使用です。実際のところ、C ++の知識がなく、ObjCのバックグラウンドを持つ同僚は、削除せずにメモリリークを引き起こしていました。そしてより一般的には; 野生newのは眉をひそめ、とされているstd::shared_ptrか、std::unique_ptr優先されなければなりません。
JBL

50

イナウのコメントで示唆されているように、一般的なケースでは、ヒープではなくスタックにすべてを保持することをお勧めします(ヒープnewに文字列を作成するため)、したがって(UTF8エンコーディングを想定):

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

8

philjordan.euで述べたように、NSStringがである可能性もありますnil。このような場合、キャストは次のように行う必要があります。

//注:fooがnilの場合、空のC ++文字列が生成されます

// UTF8StringからNULLポインタを逆参照する代わりに。

これはあなたをそのような変換に導くでしょう:

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

1
これは非常に便利です。ほとんどの人が気になるのは見落としている。Y'all gonaがNILでクラッシュ。
P私
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.