11

ISO-8859-1標準の次のによると、予約された各 HTML 文字に関連付けられたエンティティ名とエンティティ番号があるようです。

たとえば、キャラクターの場合é

エンティティ名:é

エンティティ番号:é

同様に、キャラクターの場合>

エンティティ名:>

エンティティ番号:>

指定された文字列に対して、HttpUtility.HtmlEncodeHTML でエンコードされた文字列が返されますが、それがどのように機能するのかわかりません。ここに私が意味するものがあります:

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

キャラクターにはエンティティ番号を使用しているようですが、éキャラクターにはエンティティ名を使用してい>ます。

では、HtmlEncode メソッドは本当に ISO-8859-1 標準で機能するのでしょうか? 存在する場合、エンティティ名を使用したり、エンティティ番号を使用したりする理由はありますか? さらに重要なことに、エンティティ名を確実に与えるように強制できますか?

編集: 答えてくれてありがとう。ただし、検索を実行する前に文字列をデコードできません。あまり詳しく説明しなくても、テキストは SharePoint リストに保存され、"検索" は SharePoint 自体によって (CAML クエリを使用して) 実行されます。なので、基本的にはできません。

エンティティ番号を名前に変換する方法を考えようとしています..NETにそれを行う関数はありますか? または他のアイデアはありますか?

4

5 に答える 5

4

このようにメソッドが実装されました。一部の既知の文字には対応するエンティティが使用され、それ以外のすべての文字には対応する 16 進値が使用されます。この動作を変更するためにできることはあまりありません。の実装からの抜粋System.Net.WebUtility.HtmlEncode(リフレクターで見られるように):

...
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(';');
}
...

このメソッドは常に有効で安全な、正しくエンコードされた HTML を生成するため、気にする必要はありません。

于 2011-01-31T17:27:37.617 に答える
1

私はこの機能を作りました、私はそれが役立つと思います

        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());
        }
于 2011-11-10T16:04:36.500 に答える
1

HtmlEncode 仕様に従っていますISO 標準では、すべてのエンティティに対して名前と番号の両方が指定されており、名前と番号は同等です。したがって、 の適合実装でHtmlEncodeは、すべてのポイントを数値として、またはすべてを名前として、または 2 つの混合物として自由にエンコードできます。

別の方向から問題にアプローチすることをお勧めします。HtmlDecodeターゲットテキストを呼び出してから、生の文字列を使用してデコードされたテキストを検索します。

于 2011-01-31T17:28:20.827 に答える
1

ISO-8859-1 は、HTML 文字エンコーディングとはあまり関係がありません。ウィキペディアから:

数値参照は、ページのエンコーディングに関係なく、常に Unicode コード ポイントを参照します。

未定義の Unicode コード ポイントに対してのみ、ISO-8859-1 がよく使用されます。

改行、タブ、およびキャリッジ リターン文字を除いて、永久に未定義の文字および制御文字を参照する数値参照の使用は禁止されています。つまり、16 進数の範囲 00 ~ 08、0B ~ 0C、0E ~ 1F、7F、および 80 ~ 9F の文字は、参照であっても HTML ドキュメントで使用できないため、たとえば「™」は許可されません。 . ただし、この制限を無視した初期の HTML 作成者やブラウザーとの下位互換性のために、一部のブラウザーでは、80 ~ 9F の範囲の生の文字と数字の参照は、Windows-1252 エンコーディングでバイト 80 ~ 9F にマップされた文字を表すものとして解釈されます。

あなたの質問に答えるために:検索を最適に機能させるには、エンコードされていない検索文字列を使用して、エンコードされていない HTML を実際に検索する必要があります (最初に HTML タグを削除します)。エンコードされた文字列を一致させると、HTML タグやコメントに基づくヒットや、テキストでは見えない HTML の違いによるヒットの欠落など、予期しない結果につながります。

于 2011-01-31T17:52:44.423 に答える
0

次のコードを開発して、az、AZ、および 0-1 をエンコードせずに残ります。

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();
}
于 2013-08-09T17:08:22.963 に答える