3

ISO-8859-1 の ASP.NET アプリにデータを投稿するページがあります。

<head>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
    <title>`Sample Search Invoker`</title>
</head>
<body>

<form name="advancedform" method="post" action="SearchResults.aspx">
    <input class="field" name="SearchTextBox" type="text" />
    <input class="button" name="search" type="submit" value="Search &gt;" />
</form>

およびコード ビハインド (SearchResults.aspx.cs) 内

System.Collections.Specialized.NameValueCollection postedValues = Request.Form;
String nextKey;
for (int i = 0; i < postedValues.AllKeys.Length; i++)
{
    nextKey = postedValues.AllKeys[i];

    if (nextKey.Substring(0, 2) != "__")
    {
        // Get basic search text
        if (nextKey.EndsWith(XAEConstants.CONTROL_SearchTextBox))
        {
            // Get search text value
            String sSentSearchText = postedValues[i];

            System.Text.Encoding iso88591 = System.Text.Encoding.GetEncoding("iso-8859-1");
            System.Text.Encoding utf8 = System.Text.Encoding.UTF8;

            byte[] abInput = iso88591.GetBytes(sSentSearchText);

            sSentSearchText = utf8.GetString(System.Text.Encoding.Convert(iso88591, utf8, abInput));

            this.SearchText = sSentSearchText.Replace('<', ' ').Replace('>',' ');
            this.PreviousSearchText.Value = this.SearchText;
        }
    }
}

Merkblätter を通過すると、postedValues[i] から Merkbl�tter として引き出されます。生の文字列 string は Merkbl%ufffdtter です。

何か案は?

4

7 に答える 7

7

次のコード行があります:-

String sSentSearchText = postedValues[i];

ポスト内のオクテットのデコードはここで行われました。

問題は、META http-equiv がエンコーディングについてサーバーに通知しないことです。

RequestEncoding="ISO-8859-1" を @Page ディレクティブに追加するだけで、自分でデコードをいじるのをやめることができます (既に行われているため)。

それも役に立ちません。web.config で Request encoding しか指定できないようです。

ISO-8859-1 の使用を完全に停止し、デフォルトの UTF-8 エンコーディングのままにしておくことをお勧めします。制限のあるエンコーディングを使用しても、利益は見られず、苦痛しかありません。

編集

投稿フォームのエンコーディングを変更できないと思われる場合は、自分でデコーディングを処理する以外に選択肢がないように思われます。そのために、受信コード ビハインドに次の 2 つの静的メソッドを含めます。

private static NameValueCollection GetEncodedForm(System.IO.Stream stream, Encoding encoding)
{
    System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.ASCII);
    return GetEncodedForm(reader.ReadToEnd(), encoding);
}


private static NameValueCollection GetEncodedForm(string urlEncoded, Encoding encoding)
{
    NameValueCollection form = new NameValueCollection();
    string[] pairs = urlEncoded.Split("&".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

    foreach (string pair in pairs)
    {
        string[] pairItems = pair.Split("=".ToCharArray(), 2, StringSplitOptions.RemoveEmptyEntries);
        string name = HttpUtility.UrlDecode(pairItems[0], encoding);
        string value = (pairItems.Length > 1) ? HttpUtility.UrlDecode(pairItems[1], encoding) : null;
        form.Add(name, value);
    }
    return form;
}

割り当てる代わりに:-

postedValues = Request.Form;

使用する:-

postValues = GetEncodedForm(Request.InputStream, Encoding.GetEncoding("ISO-8859-1"));

コードの残りの部分からエンコーディング marlarky を削除できるようになりました。

于 2009-06-18T11:45:24.130 に答える
2

私はあなたのエンコーディングをそのようにweb.configに追加することでおそらくあなたの問題を解決すると思います:

<configuration>
   <system.web>
      <globalization
           fileEncoding="iso-8859-1"
           requestEncoding="iso-8859-1"
           responseEncoding="iso-8859-1"
           culture="en-US"
           uiCulture="en-US"
        />
   </system.web>
</configuration>
于 2009-06-18T11:39:23.003 に答える
2

私たちはあなたと同じ問題を抱えていました。トピックはまったく簡単ではありません。

最初のヒントは、データを送信するページ (通常、.NET でデータを受信するページと同じページ) の応答エンコーディングを、目的の形式のポスト エンコーディングに設定することです。

ただし、これは、サーバーから送信された文字を解釈する方法に関するユーザーのブラウザーへのヒントにすぎません。ユーザーは、エンコーディングを手動で上書きすることを選択する場合があります。また、ユーザーがページのエンコーディングをオーバーライドすると、フォームで送信されるデータのエンコーディングも (ユーザーが設定したエンコーディングに) 変更されます。

ただし、小さなトリックがあります。フォームに名前 (アンダースコアに注意してください) を含む隠しフィールドを追加すると_charset_、ほとんどのブラウザーは、フォームを投稿するときに使用される文字セットの名前をこのフォーム フィールドに入力します。このフォーム フィールドも HTML5 仕様の一部です。

したがって、これで問題ないと思うかもしれませんが、ページでは、フォームに送信されたすべてのパラメーターが ASP.NET によって既に URL デコードされています。そのため、実際にフィールドに値がある場合、 Merkblätter_charset_を含むフィールドの値は、.NET によって既に正しくデコードされていません。

次の 2 つのオプションがあります。

  1. 問題の ASP.NET ページで、要求文字列の解析を手動で実行します。
  2. Application_BeginRequest の Global.asax で、要求パラメーターを手動で解析し、_charset_フィールドを抽出します。値を取得したら、 に設定Request.ContentEncodingSystem.Text.Encoding.GetEncoding(<value of _charset_ field>)ます。これを行うと、クライアントが値を送信する文字セットに関係なく、通常どおりMerkblätterを含むフィールドの値を読み取ることができます。

上記のいずれの場合でも、手動で を読み取っRequest.InputStreamてフォーム データを取得する必要があります。Response Encoding を UTF-8 に設定して、受け入れる文字の最大数のオプションを設定し、上記で指定したように、ユーザーが特に文字セットをオーバーライドした場合の特殊なケースを処理することをお勧めします。

于 2010-03-23T17:41:02.740 に答える
1
Function urlDecode(input)
 inp = Replace(input,"/","%2F")
 set conn = Server.CreateObject("MSXML2.ServerXMLHTTP")
 conn.setOption(2) = SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
 conn.open "GET", "http://www.neoturk.net/urldecode.asp?url=" & inp, False
 conn.send ""
 urlDecode = conn.ResponseText
End Function

これを高速化するには、デコードおよびエンコードされた URL のテーブルをデータベースに作成し、global.asa application.on_start セクションでそれらを読み取ります。後でそれらをアプリケーション オブジェクトに配置します。次に、そのアプリケーション obj のチェック プロシージャを配置します。上記の関数で、IF デコードされた URL がアプリ配列に存在しない場合は、リモート ページから 1 回要求します (ヒント: urldecode.asp は別のサーバーにある必要があります: http://support.microsoft.com/default.aspx?scid=を参照してください)。 kb;en-us;Q316451 ) を db に挿入し、アプリケーション配列オブジェクトに追加すると、ELSE はアプリケーション obj から関数を返します。

これは私が今まで見つけた中で最高の方法です。アプリケーション オブジェクト、データベース操作などの詳細が必要な場合は、admin@neoturk.net までご連絡ください。

上記の方法が正常に機能していることは、lastiktestleri.com/Home で確認できます。

私も使用しました。HeliconTech の ISAPI_Rewrite Lite バージョンの使用法は簡単です。

于 2009-11-24T00:17:56.813 に答える
0

私は同じ問題を抱えていましたが、次のように解決しました:

  System.Text.Encoding iso_8859_2 = System.Text.Encoding.GetEncoding("ISO-8859-2");
  System.Text.Encoding utf_8 = System.Text.Encoding.UTF8;

  NameValueCollection n = HttpUtility.ParseQueryString("RT=A+v%E1s%E1rl%F3+nem+enged%E9lyezte+a+tranzakci%F3t", iso_8859_2);
  Response.Write(n["RT"]);

A+v%E1s%E1rl%F3+nem+enged%E9lyezte+a+tranzakci%F3t は、期待どおり「A vásárló nem engedélyezte a tranzakciót」を返します。

于 2009-06-27T19:12:27.450 に答える
0

これは、文字列を ISO-8859-1 としてエンコードし、UTF-8 としてエンコードされた文字列であるかのようにデコードしているためです。これは間違いなくデータを台無しにします。

そのエンコーディングを使用してページを送信したという理由だけで、フォームはデータを ISO-8859-1 として投稿していません。フォーム データのエンコーディングを指定していないため、ブラウザはフォーム内のデータを処理できるエンコーディングを選択します。ISO-8859-1 を選択する場合もありますが、他のエンコーディングを選択する場合もあります。

データはサーバーに送信され、ブラウザーで指定されたエンコーディングに従ってデコードされ、Request.Form コレクションに入れられます。

Request.Form コレクションから既にデコードされた文字列を読み取るだけです。テキスト ボックスの名前は既にわかっているため、コレクション内のすべての項目をループする必要もありません。

ただ行う:

string sentSearchText = Request.Form("SearchTextBox");
于 2009-06-18T11:44:23.913 に答える
0

私が最終的にやったのは、アプリを ISO-8859-1 に強制することでした。残念ながら、基になるデータにはそのコードページにうまく適合しない文字が含まれている可能性があるため、データを表示する前にデータを調べ、127 の文字コードに関するすべてをエンティティに変換します。理想的ではありませんが、私たちにとってはうまくいきます...

于 2009-06-24T17:20:06.567 に答える