Comment savoir si le texte dans le Presse-papiers de Windows est ISO 8859 ou UTF-8 en C ++?

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

  •  03-07-2019
  •  | 
  •  

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);
        }
    }
}
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top