تعطيل ADBLOCK

يمنع ADBlock بعض المحتوى على الموقع

ADBlock errore

سؤال

وأنا أبحث لما يعادل ويندوز _wfopen() تحت ماك OS X. أي فكرة؟

وأنا في حاجة الى ذلك من أجل الميناء مكتبة Windows يستخدم wchar* واجهة الملف الخاص به. كما يهدف هذا وجود مكتبة عبر منصة، أنا غير قادر على الاعتماد على كيفية الحصول على تطبيق العميل مسار الملف واعطائها الى المكتبة.

المحلول

وPOSIX API في نظام التشغيل Mac OS X صالحة للاستعمال مع UTF-8 السلاسل. من أجل تحويل سلسلة wchar_t إلى UTF-8، فمن الممكن استخدام إطار CoreFoundation من نظام التشغيل Mac OS X.

وهنا هو الفئة التي سيتم التفاف سلسلة ولدت في UTF-8 من سلسلة wchar_t.

class Utf8
{
public:
    Utf8(const wchar_t* wsz): m_utf8(NULL)
    {
        // OS X uses 32-bit wchar
        const int bytes = wcslen(wsz) * sizeof(wchar_t);
        // comp_bLittleEndian is in the lib I use in order to detect PowerPC/Intel
        CFStringEncoding encoding = comp_bLittleEndian ? kCFStringEncodingUTF32LE
                                                       : kCFStringEncodingUTF32BE;
        CFStringRef str = CFStringCreateWithBytesNoCopy(NULL, 
                                                       (const UInt8*)wsz, bytes, 
                                                        encoding, false, 
                                                        kCFAllocatorNull
                                                        );

        const int bytesUtf8 = CFStringGetMaximumSizeOfFileSystemRepresentation(str);
        m_utf8 = new char[bytesUtf8];
        CFStringGetFileSystemRepresentation(str, m_utf8, bytesUtf8);
        CFRelease(str);
    }   

    ~Utf8() 
    { 
        if( m_utf8 )
        {
            delete[] m_utf8;
        }
    }

public:
    operator const char*() const { return m_utf8; }

private:
    char* m_utf8;
};

والاستعمال:

const wchar_t wsz = L"Here is some Unicode content: éà€œæ";
const Utf8 utf8 = wsz;
FILE* file = fopen(utf8, "r");

وهذا سيعمل على القراءة أو الكتابة الملفات.

نصائح أخرى

وأنت فقط تريد أن فتح مؤشر ملف باستخدام مسار التي قد تحتوي على أحرف Unicode، أليس كذلك؟ يمر المسار في تمثيل الملفات إلى fopen.

    <لى>

    إذا جاء المسار من الأسهم الأطر ماك OS X (على سبيل المثال، لجنة المفتوحة سواء الكربون أو الكاكاو)، فإنك لن تحتاج إلى القيام بأي تحويل على ذلك، وسوف تكون قادرة على استخدامه لعم غير.

    <لى>

    إذا كنت توليد جزء من المسار نفسك، يجب إنشاء CFStringRef من المسار الخاص بك ومن ثم الحصول على ذلك في تمثيل نظام الملفات لتمريرها إلى واجهات برمجة التطبيقات POSIX مثل open أو fopen.

وعموما، سوف لا يكون لديك لتفعل الكثير من ذلك بالنسبة لمعظم التطبيقات. على سبيل المثال، قد يكون العديد من التطبيقات ملفات البيانات الإضافية المخزنة الدليل دعم التطبيق للمستخدم، ولكن طالما أن أسماء تلك الملفات ASCII، وكنت تستخدم القياسية واجهات برمجة التطبيقات ماك OS X لتحديد موقع الدليل دعم التطبيق للمستخدم، لا تحتاج القيام به حفنة من تحويل بجنون العظمة من مسار شيدت مع هذين العنصرين.

قام لإضافة: أود أن أحذر بشدة على ضد تحويل تعسفي كل شيء إلى UTF-8 باستخدام شيء من هذا القبيل wcstombs لترميز الملفات ليست مطابقة للولدت بالضرورة UTF-8 . ماك OS X و Windows كلا استخدام قواعد التحلل الكنسي محددة (ولكن مختلفة) لالترميز المستخدم في مسارات الملفات.

وعلى سبيل المثال، فإنها تحتاج إلى أن تقرر ما إذا كانت "é" سيتم تخزين واحدة أو وحدتين كود (إما LATIN SMALL LETTER E WITH ACUTE أو LATIN SMALL LETTER E تليها COMBINING ACUTE ACCENT). وهذه تؤدي إلى مختلفين - وطول مختلفة - تسلسل بايت، وكلا MAC OS X وعمل ويندوز لتجنب وضع ملفات متعددة بنفس الاسم (كمستخدم ينظر لهم) في نفس الدليل

وقواعد لكيفية تنفيذ هذا التحلل الكنسي يمكن الحصول على شعر جميل، وذلك بدلا من محاولة لتنفيذ ذلك بنفسك فمن الأفضل أن تترك للوظائف وفرت الأطر النظام بالنسبة لك أن تفعل رفع الأحمال الثقيلة.

وJKP:

وليس كل وظائف في ماك X تقبل UTF8، ولكن أسماء وفيليباثس قد يكون UTF8، وبالتالي جميع وظائف POSIX التعامل مع الوصول إلى الملفات (مفتوحة، الدالة fopen، والقانون الأساسي، وما إلى ذلك) تقبل UTF8.

هنا . اقتباس:

<اقتباس فقرة>   

وكيف يبدو اسم ملف على مستوى API   يعتمد على API. الكربون الحالي   واجهات برمجة التطبيقات التعامل مع أسماء الملفات على أنها مجموعة من   UTF-16 حرفا؛ التعامل مع تلك POSIX   بأنها مجموعة من UTF-8، وهو   لماذا UTF-8 تعمل بشكل جيد في المحطة. كيف   لقد تم تخزينه على القرص يعتمد على   تنسيق القرص. HFS + يستخدم UTF-16، ولكن   هذا ليس مهما في معظم الحالات.

وبعض الوظائف الأخرى POSIX التعامل مع UTF8 كذلك. مثلا وظائف التعامل مع أسماء المستخدمين، أسماء مجموعة أو كلمات السر للمستخدم استخدام UTF8 لتخزين المعلومات (وبالتالي يمكن أن يكون اسم المستخدم وكلمة المرور الياباني يمكن أن يكون الصيني، لا مشكلة).

ولكن ليس كل مقبض UTF8. مثلا لجميع وظائف سلسلة سلسلة UTF8 هو مجرد C سلسلة العادية والحروف فوق 126 ليس لديهم معنى خاص. أنهم لا يفهمون مفهوم بايت متعددة (حرف في C) تشكيل حرف Unicode واحد. كيف التعامل مع واجهات برمجة التطبيقات الأخرى شار * يتم تمرير مؤشر لهم يختلف عن API إلى API. ومع ذلك، كقاعدة كما الإبهام يمكنك أن تقول:

وإما وظيفة لا يقبل إلا سلاسل C مع شخصيات ASCII نقية (فقط في نطاق 0-126) أو أنها ستقبل UTF8. عادة وظائف لا تسمح الأحرف فوق 126 وتفسيرها في أي ترميز غير UTF8. إذا كان هذا هو الحال فعلا، تم توثيقه، وبعد ذلك يجب أن يكون هناك وسيلة لتمرير ترميز مع السلسلة.

إذا كنت تستخدم الكاكاو فإنه من السهل إلى حد ما مع NSString. مجرد تحميل البيانات UTF16 في استخدام -initWithBytes: الطول: الترميز: (أو ربما -initWithCString: ترميز :) ومن ثم الحصول على نسخة UTF8 عن طريق الاتصال UTF8String على النتيجة. ثم، ما عليك سوى الاتصال الدالة fopen معكم سلسلة UTF8 جديدة مع المعلمة.

ويمكنك استدعاء الدالة fopen بالتأكيد مع سلسلة UTF-8، بغض النظر عن اللغة - لا يمكن أن تساعد في C ++ على OSX على الرغم - آسف

ولقد قرأت اسم الملف من ملف UTF8 التكوين من خلال <القوي> wifstream (ويستخدم على wchar_t عازلة).

وتنفيذ ماك يختلف عن لينكس وويندوز. wifstream يقرأ كل بايت من ملف لفصل الخلايا wchar_t في المخزن المؤقت. لذلك لدينا 3 بايت فارغة، على الرغم من على فتح يتطلب <قوية> شار السلسلة. وهكذا مبرمج يمكن استخدامها على wcstombs وظيفة لتحويل سلسلة أحرف واسعة لمتعددة البايت سلسلة.

ووAPI يدعم UTF8. لأفضل مراقب فهم استخدام الذاكرة ومحرر عرافة لملف.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow