كيفية معرفة ما إذا كان النص في الحافظة ويندوز هو ISO 8859 أو UTF-8 في C ++؟
سؤال
وأود أن أعرف إذا كان هناك طريقة سهلة لاكتشاف ما إذا كان النص على الحافظة في 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