Как определить, соответствует ли текст в буфере обмена Windows стандарту ISO 8859 или UTF-8 на C ++?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хотел бы знать, есть ли простой способ определить, находится ли текст в буфере обмена в формате ISO 8859 или UTF-8?

Вот мой текущий код:

    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);
        }
    }
}
Это было полезно?

Решение

Ознакомьтесь с определением CF_LOCALE на этой странице Microsoft . Он говорит вам локаль текста в буфере обмена. Еще лучше, если вместо этого вы используете CF_UNICODETEXT, Windows преобразует вас в UTF-16.

Другие советы

UTF-8 имеет определенную структуру для байтов не ASCII. Вы можете сканировать байты > = 128 и, если они обнаружены, проверить, не формируют ли они допустимую строку UTF-8.

Действительные форматы байтов UTF-8 можно найти в Википедии :

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
<Ч>

старый ответ:

Вам не нужно - весь текст ASCII является допустимым UTF-8, поэтому вы можете просто декодировать его как UTF-8, и он будет работать как положено.

Чтобы проверить, содержит ли он символы, не входящие в ASCII, можно выполнить поиск байтов > = 128.

Я могу ошибаться, но я думаю, что вы не можете: если я открою файл UTF-8 без Bom в моем редакторе, он будет отображаться по умолчанию как ISO-8859-1 (моя локаль), и помимо странного использования иностранные (для меня) акцентированные символы, у меня нет сильного визуального намека на то, что это UTF-8 (если только он не закодирован в другом месте, например, в объявлении charset в HTML или XML): это совершенно правильный текст Ansi.

Джон написал " весь текст ASCII действителен в формате UTF-8 " но обратное верно.

Windows XP +, естественно, использует UTF-16 и имеет для него формат буфера обмена, но AFAIK просто игнорирует UTF-8, без особой обработки для него.
(Ну, есть API для преобразования UTF-8 в UTF-16 (или Ansi и т. Д.), На самом деле).

Вы могли бы проверить, доступен ли obj.IsDataAvailable(CF_UNICODETEXT), чтобы узнать, доступна ли версия в юникоде того, что находится в буфере обмена.

-Адам

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top