MSVC bo'lmagan kompilyator yordamida Windows ostida Unicode fayl nomi bilan fstreamni ochish

Fayl nomi "Unicode" fayl nomi bo'lsa, men faylni std::fstream (yoki boshqa std::ostream) sifatida ochishim kerak.

MSVC ostida menda nostandart kengaytma bormi std::fstream::open(wchar_t const *,...)? GCC (eng muhim) va ehtimol Borland kompilyatori kabi boshqa kompilyatorlar bilan nima qilishim mumkin.

CRTL _wfopen ni taqdim etishini bilaman, lekin u io-streamlar o'rniga C FILE * interfeysini beradi, balki FILE * dan io-stream yaratishning nostandart usuli bormi? Windows uchun MSVC kabi kengaytmali boost::ifstream bormi?


person Artyom    schedule 23.02.2010    source manba
comment
Siz qila olmaysiz. Mac OS X da POSIX api fayli - va shuning uchun std :: fstream - barchasi utf-8 ni oladi, deb qaror qilindi. Platformaga xos kengaytmalar mavjud bo'lmagan muhitlarda (masalan, derazalardagi gcc va bc (aslida ularning o'z kengaytmalari bo'lishi mumkin, lekin bu POSIX standartidan tashqarida bo'lishi mumkin)) c va c++ ish vaqti funksiyalariga ishonchli kirishni kutish mumkin emas. fayl tizimi nomida ascii bo'lmagan belgilar bilan berilgan fayllar.   -  person Chris Becke    schedule 23.02.2010
comment
@Chris UTF-8 ni qo'llab-quvvatlaydigan kutubxona bilan hech qanday muammom yo'q - bu men uchun juda mos. Muammo Windows UTF-8-ni qo'llab-quvvatlamaydi   -  person Artyom    schedule 23.02.2010
comment
MinGW uchun noto'g'ri vaqtinchalik yechim stackoverflow.com/questions/6524821/opening sahifasida joylashgan. -funksiya orqali oqim   -  person marcin    schedule 02.03.2015


Javoblar (3)


Afsuski, buni qilishning standart usuli yo'q, garchi C++ 0x (1x?) buni qilishni va'da qilsa. Ungacha siz yechimni Boost-da topish mumkin deb o'ylagan edingiz, ammo siz qidirayotgan kutubxona Boost.Filesystem.

Boost.Filesystem o'zining universal yo'l tizimi uchun sukut bo'yicha keng satrlardan foydalanadi, shuning uchun bu borada unicode bilan bog'liq muammolar mavjud emas.

person Kornel Kisielewicz    schedule 23.02.2010
comment
C++ 0X uchun ma'lumotnomangiz bormi? Muhokamalarni eslayman, lekin xulosa yo'q va oxirgi loyihada hech narsa topmadim. - person AProgrammer; 23.02.2010
comment
Muammo shundaki, boost::filesystem MinGW/GCC ostida wpath-ni qo'llab-quvvatlamaydi, chunki kuchaytirish konfiguratsiyasi ba'zi sabablarga ko'ra BOOST_NO_STD_WSTRING ni belgilaydi (hatto keng qatorlar mingw ostida juda yaxshi ishlaydi) - person Artyom; 23.02.2010
comment
Men biroz ko'proq qidirib, buni topdim: open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#454, TR2 kutubxonasidan oldin hech qanday yechim topilmagan. - person AProgrammer; 23.02.2010
comment
Menimcha, wchar_t qo'shish yaxshi yechim emas. Menimcha, MS CRTL faqat UTF-8 satrlarini qo'llab-quvvatlashi kerak. Windows asosiy qismlar uchun keng API ishlatadigan yagona operatsion tizimdir. - person Artyom; 24.02.2010
comment
@art muammo shundaki, Windows utf8 ixtiro qilinishidan oldin unicode-ni qo'llab-quvvatlagan va keng o'sha paytda eng yaxshi tanlov edi. Endi matritsa quyiladi. - person David Heffernan; 19.06.2011

Hozircha oson yechim yo'q.

Kaput ostida _wfopen ishlatadigan o'zingizning oqim buferingizni yaratishingiz kerak. Buning uchun foydalanishingiz mumkin, masalan, boost::iostream

person Artyom    schedule 19.06.2011

Unicode fayl nomini wcstombs() yoki WideCharToMultiByte() kabilar yordamida char* qatoriga aylantiring (bu sizga tegishli kod sahifalari ustidan koʻproq nazorat qilish imkonini beradi).

Keyin faylni ochish uchun aylantirilgan fayl nomidan foydalaning.

person Michael Burr    schedule 23.02.2010
comment
Fayl nomi joriy mahalliy kod sahifasida ko'rsatilmasligi mumkin bo'lgan unicode belgilarni o'z ichiga oladi (ya'ni, ibroniycha belgilarni Lotin1 8 bitli tilda ko'rsatib bo'lmaydi), shuningdek, Windows UTF-8 kod sahifalarini qo'llab-quvvatlamaydi. Shunday qilib, yo'q, bu ishlamaydi. - person Artyom; 23.02.2010