Comment savoir si le texte dans le Presse-papiers de Windows est ISO 8859 ou UTF-8 en C ++?
Question
J'aimerais savoir s'il existe un moyen simple de détecter si le texte du presse-papiers est au format ISO 8859 ou UTF-8?
Voici mon code actuel:
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);
}
}
}
La solution
Consultez la définition de CF_LOCALE à l'adresse cette page Microsoft. . Il vous indique les paramètres régionaux du texte dans le presse-papiers. Mieux encore, si vous utilisez plutôt CF_UNICODETEXT, Windows sera converti au format UTF-16 pour vous.
Autres conseils
UTF-8 a une structure définie pour les octets non-ASCII. Vous pouvez rechercher des octets > = 128 et, s’ils en détectent, vérifier s’ils forment une chaîne UTF-8 valide.
Les formats d'octets UTF-8 valides sont disponibles sur Wikipedia :
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
ancienne réponse:
Vous n'êtes pas obligé - tout le texte ASCII est au format UTF-8 valide. Vous pouvez donc le décoder au format UTF-8 et il fonctionnera comme prévu.
Pour vérifier s’il contient des caractères non-ASCII, vous pouvez rechercher des octets > = 128.
Je peux me tromper, mais je pense que vous ne pouvez pas: si j'ouvre un fichier UTF-8 sans Bom dans mon éditeur, il s'affiche par défaut sous le nom ISO-8859-1 (mes paramètres régionaux), et à côté d'une utilisation étrange de caractères étrangers accentués (pour moi), je n'ai aucune indication visuelle forte qu'il s'agisse de UTF-8 (à moins qu'il ne soit codé d'une autre manière, par exemple, la déclaration de charset en HTML ou XML): il s'agit d'un texte Ansi parfaitement valide.
John a écrit "tout le texte ASCII est en UTF-8 valide" mais l'inverse est vrai.
Windows XP + utilise naturellement le format UTF-16 et possède un format de presse-papiers, mais autant que je sache, il ignore tout simplement le format UTF-8, sans traitement particulier.
(Eh bien, il existe une API pour convertir UTF-8 en UTF-16 (ou Ansi, etc.), en fait).
Vous pouvez vérifier que obj.IsDataAvailable (CF_UNICODETEXT) indique si une version unicode de ce qu'il y a dans le Presse-papiers est disponible.
-Adam