อินเทอร์เฟซ UTF-8 แบบพกพา (Windows และ Unix) ที่ไม่มี Wide API

ฉันกำลังตั้งค่าเส้นทางไปยังไฟล์บนฮาร์ดไดรฟ์โดยใช้อินเทอร์เฟซต่อไปนี้:

void setPath(const char* path);

เส้นทางนี้จะใช้สำหรับไฟล์ I/O พื้นฐาน

ตัวอย่างเช่น หากฉันระบุเส้นทางที่มีอักขระภาษาจีน ( เช่น ผ่าน QString::toUtf8()) สิ่งนี้จะทำงานได้ดีสำหรับ Unix แต่แน่นอนว่าใช้ไม่ได้กับ Windows เนื่องจากการใช้งานภายในของ wchar/wstring API

ตอนนี้ฉันกำลังค้นหาวิธีที่หรูหราในการทำให้อินเทอร์เฟซ UTF-8 นี้เข้ากันได้กับทั้งระบบที่ใช้ Windows และ Unix มีวิธีหลีกเลี่ยง wide API บนระบบที่ใช้ Windows และใช้ std::string และ std::ofstream() ต่อไปหรือไม่

หลังจากดู boost::locale แล้ว สิ่งนี้ปรากฏสำหรับฉันว่ามีความเป็นไปได้ที่จะจัดการการเข้ารหัส UTF-8 นี่จะเป็นวิธีที่จะไป (แทนที่ std::ofstream ด้วย boost::ofstream() counterparts เช่น ? )

const std::locale loc = generator.generate(std::locale(), "zh_CN.UTF-8");
std::locale::global(loc);
std::cout.imbue(std::locale());
boost::filesystem::path::imbue(std::locale())

ความช่วยเหลือทั้งหมดได้รับการชื่นชม


person iam-tom    schedule 26.05.2015    source แหล่งที่มา


คำตอบ (1)


มีวิธีหลีกเลี่ยง Wide API บนระบบที่ใช้ Windows หรือไม่

Windows API ไม่รองรับ UTF-8 ยกเว้นใน API บางตัวที่เลือก ส่วนใหญ่รองรับเฉพาะ ANSI และ UTF-16 ที่ขึ้นอยู่กับสถานที่เท่านั้น เพื่อรองรับ Unicode โดยไม่สูญเสียข้อมูล คุณต้องใช้ API ที่ใช้ UTF-16

อินเทอร์เฟซของคุณจะต้องแปลงสตริง UTF-8 เป็น UTF-16 ภายในเมื่อส่งต่อไปยังฟังก์ชัน Windows API และแปลงจาก UTF-16 เป็น UTF-8 เมื่อรับข้อมูลจาก API ไม่มีทางอื่น สิ่งนี้อยู่ในตรรกะเฉพาะแพลตฟอร์มของคุณ ไม่ใช่ในอินเทอร์เฟซสาธารณะในเลเยอร์ที่สูงกว่า

และใช้ std::string และ std::ofstream() ต่อไป?

คุณสามารถใช้ std::string สำหรับ UTF-8 และมีวิธีการแปลงระหว่าง std::string UTF-8 และ std::wstring UTF-16 หลายวิธี (มีแม้กระทั่งคลาสใน C ++ 11 ที่จะจัดการเรื่องนั้น)

Microsoft มีนามสกุลที่ไม่ได้มาตรฐานเป็น std::ifstream และ std::ofstream ใน Visual Studio เพื่อยอมรับชื่อไฟล์ UTF-16 ผู้จำหน่ายรายอื่นอาจมีหรือไม่มีฟังก์ชันการทำงานที่คล้ายคลึงกัน

person Remy Lebeau    schedule 27.05.2015