0

我有一个支持多种语言的页面(用户可以随时更改语言)。
我根据 Initialize Culture 方法中的用户选择来更新线程的文化。

我还根据所选国家/地区的代码页更新响应对象,并将其字符集设置为所用编码的 WebName(如果我不根据代码页更新响应对象,则绑定到控件的数据会出现乱码)。资源文件也基于代码页进行本地化。

完成上述更改后,页面在浏览器中正确显示。

但是,当用户使用其中一种亚洲语言输入数据时,文本就会变得一团糟。下拉列表实际上抛出了无效回调或回发参数异常。

在检查 request.contentEncoding 时,我发现它仍然是 UTF-8(在 web.config 中设置)。

如果我在 BeginRequest 事件期间更改 request.ContentEncoding,则输入正确。但我不确定用户在页面周期的早期选择的语言。

上述方法是正确的方法吗?如何动态设置传入请求的编码?

4

1 回答 1

2

该请求是客户发送给您的。您无法选择他发送的内容,这是您的输入。但是,客户端可能应该以包含表单的页面上定义的编码发送此输入。

您是否在页面上正确设置了字符集?你确定你不发送例如

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

在 HTML 标头中,而数据采用不同的编码?

在评论后添加:如果我理解正确,您正在以不同于 UTF-8 的编码生成输出页面(您确定需要这样做吗?)。之后,您在解码 POST 回的表单数据时遇到问题。最简单的方法是确保数据以 UTF-8 回发。为此,HTML 定义accept-charsetform. 但是,IE 不支持该属性。对于 IE,有一个hack:你可以尝试添加一个包含任何“奇怪”Unicode 字符的假冒<input>,以强制 IE 发布为 UTF-8。

这不是很好,一个更简单的解决方案就是始终使用 UTF-8——你真的需要为你的输出页面使用不同的编码吗?

或者,如果您确实需要以另一种编码输出数据,您的设置解决方案Request.ContentEncoding是 AFAIAA 唯一可以使用的方法。要确定使用的编码,我建议添加一个 POST 回的隐藏字段(理论上,您可以使用 HTTP 标头,但我认为浏览器不会将它们与 POST 数据一起发送),以使用如下内容:

    public void Application_BeginRequest(object sender, EventArgs args)
    {
        var inputEncoding = Request.Form["hiddenEncoding"];
        if (!String.IsNullOrEmpty(inputEncoding)) Request.ContentEncoding = Encoding.GetEncoding(inputEncoding);
    }
于 2011-02-12T23:21:03.010 回答