Frage

Nach folgenden Tisch für die ISO-8859-1 Standard, es scheint einen Entitätsnamen und eine Entitätsnummer zu geben, die jedem reservierten HTML -Zeichen zugeordnet ist.

Also zum Beispiel für den Charakter é :

Entitätsname : é

Entitätsnummer: é

Ebenso für den Charakter > :

Entitätsname : >

Entitätsnummer: >

Für eine bestimmte Zeichenfolge die HttpUtility.HtmlEncode Gibt eine HTML -codierte Zeichenfolge zurück, aber ich kann nicht herausfinden, wie es funktioniert. Hier ist was ich meine:

Console.WriteLine(HtmlEncode("é>"));
//Outputs é>

Es scheint die Entitätsnummer für die zu verwenden é Charakter aber der Entitätsname für die > Charakter.

Funktioniert die HTMlencode-Methode also wirklich mit dem ISO-8859-1 Standard? Wenn dies der Fall ist, gibt es einen Grund, warum es manchmal den Entitätsnamen und manchmal die Entitätsnummer verwendet? Noch wichtiger ist, kann ich es zwingen, mir den Namen des Entität zuverlässig zu geben?

BEARBEITEN :Danke für die Antworten Jungs. Ich kann die Zeichenfolge jedoch nicht dekodieren, bevor ich die Suche durchführe. Ohne auf zu viele Details einzugehen, wird der Text in einer SharePoint -Liste gespeichert und die "Suche" wird von SharePoint selbst durchgeführt (unter Verwendung einer CAML -Abfrage). Im Grunde nicht kann ich nicht.

Ich versuche, über eine Möglichkeit nachzudenken, die Entitätsnummern in Namen umzuwandeln. Gibt es eine Funktion in .NET, die das tut? Oder eine andere Idee?

War es hilfreich?

Lösung

So wurde die Methode implementiert. Für einige bekannte Zeichen verwendet es die entsprechende Entität und für alles andere verwendet es den entsprechenden Hex -Wert und es gibt nicht viel, um dieses Verhalten zu ändern. Auszug aus der Umsetzung von System.Net.WebUtility.HtmlEncode (wie mit Reflektor gesehen):

...
if (ch <= '>')
{
    switch (ch)
    {
        case '&':
        {
            output.Write("&amp;");
            continue;
        }
        case '\'':
        {
            output.Write("&#39;");
            continue;
        }
        case '"':
        {
            output.Write("&quot;");
            continue;
        }
        case '<':
        {
            output.Write("&lt;");
            continue;
        }
        case '>':
        {
            output.Write("&gt;");
            continue;
        }
    }
    output.Write(ch);
    continue;
}
if ((ch >= '\x00a0') && (ch < 'Ā'))
{
    output.Write("&#");
    output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo));
    output.Write(';');
}
...

Damit sollten Sie sich nicht darum kümmern, dass diese Methode immer gültige, sichere und korrekt codierte HTML erzeugt.

Andere Tipps

HtmlEncode ist folgt der Spezifikation. Der ISO -Standard gibt sowohl einen Namen als auch eine Nummer für jede Entität an, und der Name und die Nummer sind gleichwertig. Daher eine konforme Implementierung von HtmlEncode Kann alle Punkte als Zahlen oder alle als Namen oder eine Mischung der beiden codieren.

Ich schlage vor, Sie nähern sich Ihrem Problem aus der anderen Richtung: Rufen Sie an HtmlDecode Suchen Sie im Zieltext mit der rohen Zeichenfolge durch den dekodierten Text.

ISO-8859-1 ist für die HTML-Charaktercodierung nicht wirklich relevant. Aus Wikipedia:

Numerische Referenzen beziehen sich immer auf Unicode -Codepunkte, unabhängig von der Codierung der Seite.

Nur für undefinierte Unicode-Codepunkte wird häufig ISO-8859-1 verwendet:

Die Verwendung numerischer Referenzen, die sich auf dauerhaft undefinierte Zeichen und Kontrollzeichen beziehen, ist mit Ausnahme der Zeilen-, Registerkarten- und Kutsch -Rückgabeberechnung verboten. Das heißt, Charaktere in den hexadezimalen Bereichen 00–08, 0b - 0c, 0e - 1f, 7f und 80–9f können nicht in einem HTML -Dokument verwendet werden, nicht einmal durch Bezug . Für die Rückwärtskompatibilität mit frühen HTML-Autoren und Browsern, die diese Einschränkung ignorierten, werden Rohzeichen und numerische Zeichenreferenzen im Reichweite von 80–9F von einigen Browsern interpretiert, die die auf Bytes 80–9F in der Windows-1252-Codierung abgebildeten Zeichen darstellen.

Um Ihre Frage zu beantworten: Damit die Suche am besten funktioniert, sollten Sie mithilfe einer nichtcodierten Suchzeichenfolge wirklich die nichtcodierten HTML (Striping the HTML -Tags) durchsuchen. Übereinstimmende codierte Zeichenfolgen führen zu unerwarteten Ergebnissen, wie Hits, die auf HTML -Tags oder Kommentaren basieren, und Hits fehlen aufgrund von Unterschieden in der HTML, die im Text unsichtbar sind.

Ich habe diese Funktion gemacht, ich denke, sie wird helfen

        string BasHtmlEncode(string x)
        {
           StringBuilder sb = new StringBuilder();
           foreach (char c in x.ToCharArray())
               sb.Append(String.Format("&#{0};", Convert.ToInt16(c)));
           return(sb.ToString());
        }

Ich habe den folgenden Code entwickelt, um AZ, AZ und 0-1 nicht zu kodieren, sondern auszuruhen:

public static string Encode(string source)
{
    if (string.IsNullOrEmpty(source)) return string.Empty;

    var sb = new StringBuilder(source.Length);
    foreach (char c in source)
    {
        if (c >= 'a' && c <= 'z')
        {
            sb.Append(c);
        }
        else if (c >= 'A' && c <= 'Z')
        {
            sb.Append(c);
        }
        else if (c >= '0' && c <= '9')
        {
            sb.Append(c);
        }
        else
        {
            sb.AppendFormat("&#{0};",Convert.ToInt32(c));
        }
    }

    return sb.ToString();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top