Wie kann man sagen, wenn Text auf der Windows-Zwischenablage ist ISO 8859 oder UTF-8 in C ++?

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich würde gerne wissen, ob es ein einfacher Weg, wenn der Text in der Zwischenablage zu erkennen ist, ist in ISO 8859 oder UTF-8?

Hier ist mein aktueller Code:

    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);
        }
    }
}
War es hilfreich?

Lösung

Überprüfen Sie die Definition von CF_LOCALE out unter dieser Microsoft-Seite . Es sagt Ihnen, das Gebietsschema des Texts in der Zwischenablage. Noch besser wäre es, wenn Sie CF_UNICODETEXT verwenden stattdessen wird Windows auf UTF-16 konvertiert für Sie.

Andere Tipps

UTF-8 hat eine definierte Struktur für Nicht-ASCII-Zeichen. Sie können für Bytes Scannen> = 128, und wenn überhaupt erkannt werden, überprüfen, ob sie einen gültigen UTF-8-String bilden.

Die gültigen UTF-8-Byte-Formate können auf Wikipedia finden p>
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

alte Antwort:

Sie nicht zu tun haben -. Alle ASCII-Text ist gültig UTF-8, so dass Sie nur als UTF-8 dekodieren kann und es wird funktionieren wie erwartet

Um zu testen, ob es nicht-ASCII-Zeichen enthält, können Sie für Bytes Scannen> = 128.

kann ich falsch sein, aber ich denke, man kann nicht: wenn ich ohne Bom eine UTF-8-Datei öffnen, in meinem Lektor, es ist standardmäßig als ISO-8859-1 (meine locale) angezeigt wird, und neben einiger seltsamen Verwendung von Fremd (für mich), betonten Zeichen, ich habe keinen starken visuellen Hinweis, dass es UTF-8 ist (es sei denn, es an anderer Stelle in einer anderen Art und Weise codiert ist, zB charset Deklaration in HTML oder XML.). es absolut gültige Ansi Text ist

John schrieb "alle ASCII-Text gilt UTF-8", aber das Gegenteil ist der Fall.

Windows XP + verwendet natürlich UTF-16, und hat für sie ein Zwischenablage-Format, aber AFAIK es nur UTF-8, ohne spezielle Behandlung für sie ignorieren.
(Na ja, gibt es ein API UTF-8 in UTF-16 zu konvertieren (oder Ansi, etc.), tatsächlich).

Sie könnten überprüfen obj.IsDataAvailable (CF_UNICODETEXT), um zu sehen, ob eine Unicode-Version von dem, was in der Zwischenablage zur Verfügung steht.

-Adam

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top