كيفية معرفة ما إذا كان النص في الحافظة ويندوز هو ISO 8859 أو UTF-8 في C ++؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

وأود أن أعرف إذا كان هناك طريقة سهلة لاكتشاف ما إذا كان النص على الحافظة في ISO 8859 أو UTF-8؟

وهنا هو قانون بلدي الحالي:

    COleDataObject  obj;

    if (obj.AttachClipboard())
    {
        if (obj.IsDataAvailable(CF_TEXT))
        {
            HGLOBAL hmem = obj.GetGlobalData(CF_TEXT);
            CMemFile sf((BYTE*) ::GlobalLock(hmem),(UINT) ::GlobalSize(hmem));
            CString buffer;

            LPSTR str = buffer.GetBufferSetLength((int)::GlobalSize(hmem));
            sf.Read(str,(UINT) ::GlobalSize(hmem));
            ::GlobalUnlock(hmem);

            //this is my string class
            s->SetEncoding(ENCODING_8BIT);
            s->SetString(buffer);
        }
    }
}
هل كانت مفيدة؟

المحلول

وراجع تعريف CF_LOCALE على هذه الصفحة مايكروسوفت . فإنه يقول لك لغة النص في الحافظة. والأفضل من ذلك، إذا كنت تستخدم CF_UNICODETEXT بدلا من ذلك، ويندوز لتحويل UTF-16 بالنسبة لك.

نصائح أخرى

وUTF-8 لديها بنية محددة للبايت غير ASCII. يمكنك مسح بايت> = 128، وإذا تم الكشف عن وجودها، تحقق مما إذا كانت تشكل UTF-8 سلسلة صالحة.

ووUTF-8 صيغ بايت صالحة ويمكن الاطلاع على ويكيبيديا :

Unicode             Byte1           Byte2           Byte3           Byte4
U+000000-U+00007F   0xxxxxxx
U+000080-U+0007FF   110xxxxx        10xxxxxx
U+000800-U+00FFFF   1110xxxx        10xxxxxx        10xxxxxx
U+010000-U+10FFFF   11110xxx        10xxxxxx        10xxxxxx        10xxxxxx

والإجابة القديمة:

وليس لديك ل- كل نص ASCII غير صحيح UTF-8، لذلك يمكنك فقط فك ترميز UTF-8، وسوف تعمل كما هو متوقع

لمعرفة ما إذا كان يحتوي على أحرف غير ASCII، يمكنك مسح للبايت> = 128.

ويمكنني أن أكون مخطئا، ولكن أعتقد أنك لا يمكن أن: إذا قمت بفتح ملف UTF-8 بدون بوم في بلدي محرر، يتم عرضها بشكل افتراضي كما ISO-8859-1 (بلدي المحلية)، وإلى جانب استخدام بعض غريب من الخارجية (بالنسبة لي) حرف معلمة، ليس لدي أي تلميح قوي البصرية أنه UTF-8 (ما لم يتم ترميز عليه بطريقة أخرى في أماكن أخرى، مثل إعلان محارف في HTML أو XML.): لم يصح تماما النص الانسي

وكتب يوحنا "كل نص ASCII صالح UTF-8" ولكن العكس هو الصحيح.

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

هل يمكن أن تحقق لمعرفة obj.IsDataAvailable (CF_UNICODETEXT) لمعرفة ما إذا كان إصدار يونيكود ما هو في الحافظة هو متاح.

و-Adam

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