سؤال

كيف أقوم بتعيين صفحة الرموز على UTF-8 في برنامج C Windows؟

لدي مكتبة تابعة لجهة خارجية تستخدم fopen لفتح الملفات.يمكنني استخدام wcstombs لتحويل أسماء ملفات Unicode الخاصة بي إلى صفحة الرموز الحالية، ولكن إذا كان لدى المستخدم اسم ملف بحرف خارج صفحة الرموز، فسيتم قطع هذا الأمر.

من الناحية المثالية، أود فقط الاتصال بـ _setmbcp(65001) لتعيين صفحة الرموز على UTF-8، إلا أن وثائق MSDN الخاصة بـ _setmbcp تنص على أن UTF-8 غير مدعوم.

كيف يمكنني الالتفاف حول هذا؟

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

المحلول

للأسف، لا توجد وسيلة لجعل يونيكود مخطط الشفرة الحالي في ويندوز. وCP_UTF7 وCP_UTF8 الثوابت الزائفة مخططات شفرة، وتستخدم فقط في MultiByteToWideChar و WideCharToMultiByte وظائف التحويل، مثل ذكر بن.

والمشكلة هي مماثلة لتلك الطبقات fstream C ++. منشئات fstream تقبل الأسماء char* فقط، مما يجعل من المستحيل لفتح ملف باسم يونيكود صحيح. وكان الحل الوحيد التي تقدمها VC الإختراق: فتح ملف على حدة ومن ثم تعيين مؤشر إلى كائن دفق. أخشى هذا ليس خيارا بالنسبة لك، بالطبع، منذ مكتبة طرف ثالث ربما لا يقبل مقابض.

والحل الوحيد الذي يمكنني أن أفكر في إنشاء ملف مؤقت مع اسم غير يونيكود، وهي مرتبطة بشدة إلى الأصل، واستخدام ذلك كمعلمة.

نصائح أخرى

وجميع ويندوز واجهات برمجة التطبيقات التفكير في UTF-16، لذلك كنت أفضل حالا كتابة التفاف حول مكتبتك الذي يحول عند حدود.

والغريب، يعتقد ويندوز UTF-8 هو مخطط الشفرة لأغراض التحويل، لذلك يمكنك استخدام نفس واجهات برمجة التطبيقات كما تفعل للتحويل بين مخططات شفرة:

std::wstring Utf8ToUtf16(const char* u8string)
{
    int wcharcount = strlen(u8string);
    wchar_t *tempWstr = new wchar_t[wcharcount];
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount);
    wstring w(tempWstr);
    delete [] tempWstr;
    return w;
}

وشيء من شكل مماثل لتحويل الظهر.

تحديث 2018:لقد جعل Windows 10 صفحة الرموز "65001" أقل "زائفة" في خطوتين:

  1. conhost التغييرات:يستخدم نظام Windows الفرعي لنظام Linux صفحة الرموز 65001 لوحدات التحكم الخاصة به.ومن الممكن أيضا تشغيل chcp 65001 في cmd.exe منذ WSL.(وقد تسبب في بعض أخطاء بايثون غبية جدًا.)
  2. لغة كاملة المواصفات:ويندوز منذ بناء 17035 يسمح بتعيين UTF-8 كصفحة رموز محلية.يتوفر هذا بدءًا من تحديث أبريل 2018.

استخدم سيغوين (التي تنص على لغة UTF-8 افتراضيا)، أو إرسال LIBC الخاصة بك الإختراق ويندوز لأنه لا يلزم من UTF-8 UTF-16 ترجمة لويلتف غير قياسي _wfopen إلخ. وظائف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top