2008-10-03 10 views
4

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

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

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); 
     } 
    } 
} 
+0

ISO 8859-что? Есть 8859-1, 8859-2 и т. Д. – 2008-10-03 06:24:03

+0

Часть проблемы также неизвестна. Вам нужно указать CF_LOCALE. Как только у вас это получится, весь вопрос в значительной степени ответил. – MSalters 2008-10-03 14:32:18

ответ

4

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

0

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

-Adam

+0

У меня на самом деле был код, чтобы обнаружить это, но у меня были странные проблемы с ним, иногда я получаю результаты тарабарщины. Кажется, я знаю, что теперь проблема. Я предположил, что строка указывает на строку UTF-8, но она считает, что она может указывать на многие форматы, и мне нужно называть WideCharToMultiByte. – KPexEA 2008-10-03 03:35:41

1

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

Допустимым UTF-8 форматов байт можно найти на 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 

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

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

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

1

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