Wie kann man sagen, wenn Text auf der Windows-Zwischenablage ist ISO 8859 oder UTF-8 in C ++?
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);
}
}
}
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