ฉันมี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]);