Come sapere se il testo negli Appunti di Windows è ISO 8859 o UTF-8 in C ++?
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);
}
}
}
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