كيفية فتح الأمراض المنقولة جنسيا :: fstream (ofstream أو ifstream) مع اسم ملف يونيكود؟
سؤال
وأنت لا تتخيل شيئا أساسية مثل فتح ملف باستخدام 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
وفقا لمعيار، وتحديد اسم الملف في char
s قد يكون صعبا بسبب الترميز المستخدمة من قبل شار يتراوح بين 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_t
s، أو أن يكون لديه ماكرو _T()
، أو بادئة L
before النص.
وإلقاء نظرة على 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()));