كيفية فتح الأمراض المنقولة جنسيا :: fstream (ofstream أو ifstream) مع اسم ملف يونيكود؟

StackOverflow https://stackoverflow.com/questions/821873

  •  03-07-2019
  •  | 
  •  

سؤال

وأنت لا تتخيل شيئا أساسية مثل فتح ملف باستخدام C ++ مكتبة القياسية لبرنامج ويندوز كان صعب ... ولكن يبدو أن يكون. بواسطة يونيكود أقصد هنا UTF-8، لكنني يمكن أن تتحول إلى UTF-16 أو أيا كان، وهذه النقطة هو الحصول على مثيل ofstream من يونيكود اسم. قبل أن الإختراق تصل الحل بلدي، وهناك الطريق المفضل هنا؟ خصوصا عبر منصة واحدة؟

هل كانت مفيدة؟

المحلول

ووC ++ مكتبة القياسية ليست يونيكود علم. ليس مطلوبا من char وwchar_t أن تكون ترميزات يونيكود.

في ويندوز، wchar_t هو UTF-16، ولكن لم يكن هناك دعم مباشر لUTF-8 أسماء في المكتبة القياسية (نوع البيانات char لا Unicode على ويندوز)

ومع MSVC (وبالتالي STL مايكروسوفت)، يتم توفير منشئ للfilestreams التي تأخذ اسم ملف const wchar_t*، مما يسمح لك لخلق تيار على النحو التالي:

wchar_t const name[] = L"filename.txt";
std::fstream file(name);

ولكن، لم يتم تحديد هذا الحمل الزائد من مستوى C ++ 11 (أنه يضمن فقط وجود إصدار المستندة char). بل هو أيضا غير موجود على تطبيقات STL بديلة مثل libstdc دول مجلس التعاون الخليجي ++ لمينغو (-w64)، اعتبارا من نسخة ز 4.8.x ++.

ملحوظة أن مثل char على ويندوز ليست UTF8، على OS'es أخرى wchar_t قد لا يكون UTF16. لذا عموما، وهذا ليس من المرجح أن تكون محمولة. فتح تيار معين لا يعرف اسم ملف wchar_t وفقا لمعيار، وتحديد اسم الملف في chars قد يكون صعبا بسبب الترميز المستخدمة من قبل شار يتراوح بين OS'es.

نصائح أخرى

والإصدارات الحالية من Visual C ++ الأمراض المنقولة جنسيا :: basic_fstream لها طريقة open() أن تأخذ wchar_t * وفقا ل<لأ href = "http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx" يختلط = "نوفولو noreferrer"> http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx .

ومنذ C ++ 17، هناك طريقة عبر منصة لفتح الأمراض المنقولة جنسيا :: fstream مع يونيكود اسم باستخدام في الأمراض المنقولة جنسيا :: :: الملفات الزائد مسار . حتى C ++ 20، يمكنك إنشاء مسار من سلسلة UTF-8 مع الأمراض المنقولة جنسيا :: :: الملفات u8path . مثال:

std::ofstream out(std::filesystem::u8path(u8"こんにちは"));
out << "hello";

وبعد C ++ 20، يمكنك إنشاء مسار عن طريق تمرير UTF-8 إلى المنشئ: std::filesystem::path(u8"こんにちは") (سيتم إهمال u8path)

استخدم std::wofstream، std::wifstream وstd::wfstream. انهم يقبلون يونيكود اسم الملف. اسم الملف لابد من wstring، مجموعة من wchar_ts، أو أن يكون لديه ماكرو _T()، أو بادئة Lbefore النص.

وإلقاء نظرة على Boost.Nowide :

#include <boost/nowide/fstream.hpp>
#include <boost/nowide/cout.hpp>
using boost::nowide::ifstream;
using boost::nowide::cout;

// #include <fstream>
// #include <iostream>
// using std::ifstream;
// using std::cout;

#include <string>

int main() {
    ifstream f("UTF-8 (e.g. ß).txt");
    std::string line;
    std::getline(f, line);
    cout << "UTF-8 content: " << line;
}

إذا كنت تستخدم كيو تي مختلطة مع std::ifstream:

return std::wstring(reinterpret_cast<const wchar_t*>(qString.utf16()));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top