Как определить, соответствует ли текст в буфере обмена Windows стандарту ISO 8859 или UTF-8 на C ++?
Вопрос
Я хотел бы знать, есть ли простой способ определить, находится ли текст в буфере обмена в формате 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), чтобы узнать, доступна ли версия в юникоде того, что находится в буфере обмена.
-Адам