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 原始字符串字符串是 Merkbl%ufffdtter

有任何想法吗?

4

7 回答 7

7

你有这行代码: -

String sSentSearchText = postedValues[i];

帖子中的八位字节解码发生在这里。

问题是 META http-equiv 没有告诉服务器有关编码的信息。

您可以将 RequestEncoding="ISO-8859-1" 添加到 @Page 指令并停止尝试自己摆弄解码(因为它已经发生了)。

那也无济于事。看来您只能在 web.config 中指定请求编码。

最好完全停止使用 ISO-8859-1 并保留默认的 UTF-8 编码。使用限制性编码我看不到任何收获,只有痛苦。

编辑

如果似乎不可能更改发布表单的编码,那么我们似乎别无选择,只能自己处理解码。为此,在您的接收代码隐藏中包含这两个静态方法:-

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 已经对发送到表单的所有参数进行了 urldecode。因此,当您在字段中实际有值时,包含Merkblätter_charset_的字段的值已经被 .NET 错误解码。

你有两个选择:

  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 设置一个检查程序。在上述函数中,如果应用数组中不存在解码的 url,则从远程页面请求一次(提示:urldecode.asp 应该在不同的服务器上,请参阅: http: //support.microsoft.com/default.aspx ?scid= kb;en-us;Q316451)并将其插入您的数据库并附加到应用程序数组对象,否则从应用程序 obj 返回函数。

这是我找到的最好的方法。如果有人想了解有关应用程序对象、数据库操作等的更多详细信息,请通过 admin@neoturk.net 联系我

您可以在以下位置看到上述方法成功运行:lastiktestleri.com/Home

我也用过,HeliconTech 的 ISAPI_Rewrite Lite 版本用法很简单: url = Request.ServerVariables("HTTP_X_REWRITE_URL") 这将返回指向 /404.asp 的确切 url

于 2009-11-24T00:17:56.813 回答
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 回答
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 回答