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

Я хотел бы знать, есть ли простой способ определить, соответствует ли текст в буфере обмена 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);
        }
    }
}

Ответы [ 4 ]

4 голосов
/ 03 октября 2008

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

2 голосов
/ 03 октября 2008

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.

1 голос
/ 03 октября 2008

Я могу ошибаться, но я думаю, что вы не можете: если я открою файл 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 и т. Д.), На самом деле).

0 голосов
/ 03 октября 2008

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

-Adam

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...