Domanda

Vorrei sapere se esiste un modo semplice per rilevare se il testo negli Appunti è in ISO 8859 o UTF-8?

Ecco il mio codice attuale:

    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);
        }
    }
}
È stato utile?

Soluzione

Scopri la definizione di CF_LOCALE su questa pagina di Microsoft . Ti dice la localizzazione del testo negli appunti. Meglio ancora, se usi CF_UNICODETEXT invece, Windows convertirà in UTF-16 per te.

Altri suggerimenti

UTF-8 ha una struttura definita per byte non ASCII. Puoi cercare i byte > = 128 e, se presenti, verificare se formano una stringa UTF-8 valida.

I formati di byte UTF-8 validi sono disponibili su 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

vecchia risposta:

Non è necessario: tutto il testo ASCII è UTF-8 valido, quindi puoi semplicemente decodificarlo come UTF-8 e funzionerà come previsto.

Per verificare se contiene caratteri non ASCII, puoi cercare byte > = 128.

Posso sbagliarmi, ma penso che non puoi: se apro un file UTF-8 senza Bom nel mio editor, viene visualizzato per impostazione predefinita come ISO-8859-1 (impostazioni internazionali) e accanto a uno strano uso di caratteri accentati stranieri (per me), non ho alcun forte accenno visivo che sia UTF-8 (a meno che non sia codificato in un altro modo altrove, ad esempio dichiarazione di set di caratteri in HTML o XML): è testo Ansi perfettamente valido.

John ha scritto "tutto il testo ASCII è valido UTF-8" ma è vero il contrario.

Windows XP + utilizza naturalmente UTF-16 e ha un formato per gli appunti, ma AFAIK ignora solo UTF-8, senza alcun trattamento speciale per esso.
(Bene, esiste un'API per convertire UTF-8 in UTF-16 (o Ansi, ecc.), In realtà).

Puoi controllare per vedere obj.IsDataAvailable (CF_UNICODETEXT) per vedere se è disponibile una versione unicode di ciò che è negli appunti.

-Adam

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top