2008-10-27 8 views
6

Hat jemand bemerkt, dass, wenn Sie HTML aus der Zwischenablage abrufen, es die Codierung falsch und injiziert seltsame Zeichen?Wie bekomme ich richtig codierten HTML aus der Zwischenablage?

Um zum Beispiel einen Befehl wie folgt ausführen:

string s = (string) Clipboard.GetData(DataFormats.Html) 

Ergebnisse in Sachen wie:

<FONT size=-2>  <A href="/advanced_search?hl=en">Advanced 
Search</A><BR>  <A href="/preferences?hl=en">Preferences</A><BR>  <A 
href="/language_tools?hl=en">Language 
Tools</A></FONT> 

Nicht sicher, wie Markdown dieser Prozess, aber es gibt seltsame Zeichen in der resultierenden Markup über.

Es scheint, dass der Fehler mit dem .NET-Framework ist. Was ist Ihrer Meinung nach der beste Weg, korrekt codiertes HTML aus der Zwischenablage zu bekommen?

Antwort

0

Ich weiß nicht, was Ihr ursprüngliches Quelldokument ist, aber beachten Sie, dass Word und Outlook mehrere Versionen der Zwischenablage in verschiedenen Kodierungen zur Verfügung stellen. Eins ist normalerweise Windows-1252 und ein anderes ist UTF-8. Möglicherweise greifen Sie die UTF-8 codierte Version standardmäßig, wenn Sie Windows-1252 (Latin-1 + Smart Quotes) erwarten? Nicht-ASCII-Zeichen würden als mehrere ungerade Latin-1-Zeichen mit Akzent angezeigt werden. Die meisten "Smart Quotes" sind nicht im Latin-1-Set und sind oft drei Bytes in UTF-8.

Können Sie angeben, für welche Kodierung der Inhalt der Zwischenablage gewünscht wird?

3

In diesem Fall ist es nicht so sichtbar, wie es in meinem Fall war. Heute habe ich versucht, Daten aus der Zwischenablage zu kopieren, aber es gab ein paar Unicode-Zeichen. Die Daten, die ich bekam, waren so, als würde ich eine UTF-8-codierte Datei in Windows-1250-Codierung (lokale Codierung in meinem Windows) lesen.

Es scheint, Sie Fall ist das gleiche. Wenn Sie die HTML-Daten speichern (denken Sie daran, nicht breakable Leerzeichen = 0xa0 hinter dem Zeichen Â, kein Standard-Leerzeichen) in Windows-1252 (oder Windows-1250; beide Werke). Dann öffne diese Datei als UTF-8-Datei und du wirst sehen, was da sein sollte.

Für mein anderes Projekt habe ich eine Funktion, die Daten mit beschädigter Codierung reparieren.

In diesem Fall sollten einfache Umwandlung ausreichend sein:

byte[] data = Encoding.Default.GetBytes(text); 
text = Encoding.UTF8.GetString(data); 

Meine ursprüngliche Funktion ein wenig komplexer ist und enthält Tests, um sicherzustellen, dass die Daten ...

public static bool FixMisencodedUTF8(ref string text, Encoding encoding) 
{ 
    if (string.IsNullOrEmpty(text)) 
    return false; 
    byte[] data = encoding.GetBytes(text); 
    // there should not be any character outside source encoding 
    string newStr = encoding.GetString(data); 
    if (!string.Equals(text, newStr)) // if there is any character "outside" 
    return false; // leave, the input is in a different encoding 
    if (IsValidUtf8(data) == 0) // test data to be valid UTF-8 byte sequence 
    return false; // if not, can not convert to UTF-8 
    text = Encoding.UTF8.GetString(data); 
    return true; 
} 

ich nicht beschädigt sind weiß, dass dies nicht die beste (oder richtige Lösung) ist, aber ich habe keine andere Möglichkeit gefunden, wie die Eingabe zu beheben ...

EDIT: (20. Juli 2017)

Es scheint, wie die Microsoft bereits diesen Fehler gefunden und es funktioniert nun korrekt. Ich bin nicht sicher, ob das Problem in einigen Frameworks ist, aber ich weiß mit Sicherheit, dass die Anwendung jetzt ein anderes Framework verwendet als in der Zeit, als ich die Antwort geschrieben habe. (Jetzt ist es 4.5, die vorherige Version 2.0 war)

(jetzt all meine Code schlagen fehl, die Daten in dem Parsen Es gibt ein weiteres Problem, das richtige Verhalten für die Anwendung mit fix bereits aplied und ohne Verlegenheit zu bestimmen..)
0

Versuchen Sie, diese

System.Windows.Forms.Clipboard.GetText (System.Windows.Forms Textdata .html.);

0

DataFormats.Htmlspecification gibt an, dass es in UTF-8 kodiert ist. Aber es gibt einen Fehler in .NET 4 Framework und niedriger, und es liest sich tatsächlich als UTF-8 als Windows-1252.

Sie erhalten viele falsche Codierungen, die lustige/schlechte Zeichen wie "Å", "Å", "Å", "Ž", "Å¡", "Å", "ž" enthalten ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '', '' ' ' ©'

Vollständige Erklärung hier Debugging Chart Mapping Windows-1252 Characters to UTF-8 Bytes to Latin-1 Characters

Soln: ein Übersetzungswörterbuch erstellen und suchen und ersetzen.