Como saber se o texto na área de transferência do Windows é ISO 8859 ou UTF-8 em C ++?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Gostaria de saber se existe uma maneira fácil de detectar se o texto na área de transferência está em ISO 8859 ou UTF-8?

Aqui está o meu código atual:

    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);
        }
    }
}
Foi útil?

Solução

Confira a definição de CF_LOCALE em desta página Microsoft . Diz-lhe o local do texto na área de transferência. Melhor ainda, se você usar CF_UNICODETEXT em vez disso, o Windows irá converter para UTF-16 para você.

Outras dicas

UTF-8 tem uma estrutura definida para bytes não ASCII. Você pode procurar por bytes> = 128, e se algum for detectado, verifique se eles formam uma string UTF-8 válida.

Os UTF-8 formatos de bytes válidos pode ser encontrada no 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

velha resposta:

Você não tem que -. Todo o texto ASCII é válido UTF-8, assim você pode simplesmente decodificá-lo como UTF-8 e que vai funcionar como esperado

Para testar se ele contiver caracteres não-ASCII, você pode procurar por bytes> = 128.

Eu posso estar enganado, mas acho que você não pode: se eu abrir um arquivo UTF-8 sem Bom no meu editor, ele é exibido por padrão como ISO-8859-1 (meu local), e ao lado algum uso estranho de estrangeiros (para mim) caracteres acentuados, não tenho forte indício visual que é UTF-8 (a menos que seja codificado de outra maneira em outro lugar, por exemplo, declaração charset em HTML ou XML.): é texto Ansi perfeitamente válido

John escreveu "todo o texto ASCII é válido UTF-8", mas o inverso é verdadeiro.

utiliza o Windows XP + naturalmente UTF-16, e tem um formato de prancheta para ele, mas AFAIK ele simplesmente ignorar UTF-8, sem tratamento especial para ele.
(Bem, há uma API para converter UTF-8 para UTF-16 (ou Ansi, etc.), na verdade).

Você pode verificar para ver obj.IsDataAvailable (CF_UNICODETEXT) para ver se uma versão unicode do que está na área de transferência está disponível.

-Adam

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top