ฉันมีNSStringวัตถุและต้องการแปลงเป็นไฟล์std::string.
ฉันจะทำสิ่งนี้ใน Objective-C ++ ได้อย่างไร
ฉันมีNSStringวัตถุและต้องการแปลงเป็นไฟล์std::string.
ฉันจะทำสิ่งนี้ใน Objective-C ++ ได้อย่างไร
คำตอบ:
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
-cStringUsingEncoding:แทน :)
newจะขมวดคิ้วและstd::shared_ptrหรือstd::unique_ptrควรจะเป็นที่ต้องการ
ตามที่ Ynau แนะนำไว้ในความคิดเห็นในกรณีทั่วไปควรเก็บทุกอย่างไว้ในสแต็กแทนที่จะเป็นฮีป (โดยใช้newสร้างสตริงบนฮีป) ดังนั้น (สมมติว่ามีการเข้ารหัส UTF8):
NSString *foo = @"Foo";
std::string bar([foo UTF8String]);
ตามที่ระบุไว้ในphiljordan.euอาจเป็นไปได้ว่า NSString คือnil. ในกรณีเช่นนี้นักแสดงควรทำดังนี้:
// หมายเหตุ: ถ้า foo เป็นศูนย์สิ่งนี้จะสร้างสตริง C ++ ว่างเปล่า
// แทนที่จะยกเลิกการอ้างอิงตัวชี้ NULL จาก UTF8String
สิ่งนี้จะนำคุณไปสู่การแปลงดังกล่าว:
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);