هل هناك طريقة قياسية للقيام بمبرد مع مسار ملف سلسلة Unicode؟
سؤال
هل هناك طريقة قياسية للقيام بمبرد مع مسار ملف سلسلة Unicode؟
المحلول
في * Nix، يمكنك ببساطة استخدام FOPEN القياسية (انظر المزيد من المعلومات في الرد من TokeMacGuy، أو في هذا منتدى) في Windows، يمكنك استخدام _wfopen، ثم اجتياز سلسلة Unicode (لمزيد من المعلومات، انظر MSDN.).
نظرا لعدم وجود طريقة شائعة حقيقية، أود أن ألتف هذه الدعوة في ماكرو، جنبا إلى جنب مع جميع الوظائف الأخرى التي تعتمد على النظام.
نصائح أخرى
لا، ليس هناك طريقة قياسية. هناك بعض الاختلافات بين أنظمة التشغيل. إليك ما هو مقبض OSS مختلف أسماء ملفات غير ASCII.
لينكس
تحت Linux، اسم الملف هو ببساطة سلسلة ثنائية. تتمثل اتفاقية معظم التوزيعات الحديثة في استخدام UTF-8 لأسماء الملفات غير ASCII. ولكن في البداية، كان من الشائع ترميز أسماء الملفات كما ISO-8559-1. إنه أمر متروك أساسا لكل تطبيق لاختيار ترميز، حتى تتمكن من الحصول على ترميزات مختلفة تستخدم في نفس النظام. ال LANG
يمكن أن يوفر لك متغير البيئة تلميحا ما هو الترميز المفضل. ولكن هذه الأيام، ربما يمكنك أن تفترض UTF-8 في كل مكان.
هذه ليست بدون مشاكل، لأن اسم الملف يحتوي على تسلسل UTF-8 غير صالح هو صالح تماما على معظم أجهزة ملفات Linux. كيف يمكنك تحديد اسم الملف إذا كنت تدعم UTF-8 فقط؟ من الناحية المثالية، يجب عليك دعم كل من أسماء الملفات UTF-8 و Binary.
نظام التشغيل X.
يستخدم نظام ملفات HFS على نظام التشغيل OS X UNICODE (UTF-16) داخليا. معظم وظائف مكتبة C (و posix) مثل fopen
قبول سلاسل UTF-8 (لأنها متوافقة مع 8 بت) وتحويلها داخليا.
شبابيك
يستخدم Windows API UTF-16 لأسماء الملفات، ولكن fopen
يدعم فقط ASCII. العديد من وظائف مكتبة C لديها ما يعادل غير قياسي يقبل UTF-16 (wchar_t
على ويندوز). علي سبيل المثال، _wfopen
بدلا من fopen
.
هذه مسألة لغةك الحالية. على نظامي، الذي تم تمكين Unicode، ستكون مسارات الملفات في Unicode. أنا قادر على اكتشاف ذلك عن طريق أمر اللغة:
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
عادة ما يتم تعيين ترميز مسارات الملفات على نطاق واسع، لذلك إذا لم يكن مسار الملف الخاص بك في لغة النظام، فستحتاج إلى تحويله، وربما عن طريق أيقونة مكتبة.