ฉันจะแปลง NSString เป็น std :: string ได้อย่างไร


94

ฉันมีNSStringวัตถุและต้องการแปลงเป็นไฟล์std::string.

ฉันจะทำสิ่งนี้ใน Objective-C ++ ได้อย่างไร



4
@rvalue ไม่ซ้ำกัน - เป็นเพียงการแปลงตรงกันข้าม
eric

คำตอบ:


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

แก้ไข: หลังจากผ่านไปสองสามปีให้ฉันขยายคำตอบนี้ เป็นแหลมออกอย่างถูกต้องคุณมักจะต้องการที่จะใช้cStringUsingEncoding:กับถ้าคุณกำลังจะสิ้นสุดการใช้NSASCIIStringEncoding std::stringคุณสามารถใช้ UTF-8 แบบปกติstd::stringsได้ แต่โปรดทราบว่าสิ่งเหล่านี้ทำงานโดยใช้ไบต์ไม่ใช่อักขระหรือแม้แต่กราฟ สำหรับการที่ดีเป็น "การเริ่มต้น" ตรวจสอบนี้คำถามและคำตอบของมัน

นอกจากนี้โปรดทราบว่าหากคุณมีสตริงที่ไม่สามารถแสดงเป็น ASCII ได้ แต่คุณยังต้องการให้อยู่ในstd::stringและคุณไม่ต้องการอักขระที่ไม่ใช่ ASCII ในนั้นคุณสามารถใช้dataUsingEncoding:allowLossyConversion:เพื่อรับการNSDataแสดงสตริงที่มี ASCII ที่เข้ารหัสแบบ lossy แล้วโยนสิ่งนั้นไปที่ไฟล์std::string


13
ระมัดระวังในการเข้ารหัส แม้ว่า UTF-8 โดยทั่วไปจะเป็นทางเลือกที่ดี แต่หาก API ที่คุณกำลังทำงานอยู่นั้นคาดหวังเช่น ASCII บริสุทธิ์หรือหน้ารหัสของระบบคุณจะต้องใช้-cStringUsingEncoding:แทน :)
Jonathan Grynspan

13
นี่คือการรั่วไหลของหน่วยความจำหากคุณไม่ลบออกตัวชี้ที่ส่งคืนไม่ใช่วัตถุที่นับการอ้างอิง Objective-C โดยทั่วไปคุณควรหลีกเลี่ยงการใช้ตัวดำเนินการใหม่สำหรับ std :: string
SiimKallas

นี่ไม่ควรเป็นคำตอบที่ยอมรับได้และไม่ใช่สิ่งแรกที่ควรพิจารณาเมื่อทำการแปลงนั้น
JBL

@JBL หลังจากนั้นเพียง 4 ปีและไม่กี่สัปดาห์ฉันก็ไปขยายคำตอบ ฉันหวังว่าตอนนี้จะเป็นที่ยอมรับมากขึ้น
JustSid

@JustSid ฉันควรจะเข้าใจความคิดเห็นของฉัน แต่ปัญหาอื่น ๆ คือการใช้ตัวชี้โดยค่าเริ่มต้น ตามความเป็นจริงเพื่อนร่วมงานที่มีพื้นหลัง ObjC ซึ่งไม่มีความรู้ C ++ ใช้สิ่งนั้นโดยไม่ต้องลบทิ้งลงเอยด้วยความทรงจำ และโดยทั่วไป; ป่าnewจะขมวดคิ้วและstd::shared_ptrหรือstd::unique_ptrควรจะเป็นที่ต้องการ
JBL

50

ตามที่ Ynau แนะนำไว้ในความคิดเห็นในกรณีทั่วไปควรเก็บทุกอย่างไว้ในสแต็กแทนที่จะเป็นฮีป (โดยใช้newสร้างสตริงบนฮีป) ดังนั้น (สมมติว่ามีการเข้ารหัส UTF8):

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

8

ตามที่ระบุไว้ในphiljordan.euอาจเป็นไปได้ว่า NSString คือnil. ในกรณีเช่นนี้นักแสดงควรทำดังนี้:

// หมายเหตุ: ถ้า foo เป็นศูนย์สิ่งนี้จะสร้างสตริง C ++ ว่างเปล่า

// แทนที่จะยกเลิกการอ้างอิงตัวชี้ NULL จาก UTF8String

สิ่งนี้จะนำคุณไปสู่การแปลงดังกล่าว:

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

1
นี่เป็นประโยชน์อย่างมาก กังวลที่เห็นเกือบทุกคนมองข้ามไป ทำผิดพลาดใน NIL
P i
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.