1

我有两个带参数的 URL

http://localhost:8041/Reforge.aspx?name=CyanГ
http://localhost:8041/Reforge.aspx?name=Cyanì

在第一个 URL 中,Firefox 将最后一个字符 (Г) 编码为 %D0%93(在 UTF-8 中正确)。在第二个 URL 中,Firefox 将最后一个字符 (ì) 编码为 %EC(在 ISO-8859-1 中正确)

可以使用 web.config 中的元素将 ASP.NET MVC 配置为采用 UTF-8 或 ISO-8859-1。但是 Firefox 会根据上下文在编码之间切换。

请注意,UTF-8 可以明确地区分于 Latin-1 编码。

有没有办法教 ASP.NET MVC 使用其中一种格式解码参数值?

编辑:是否有一个类可以用来解码可以正确处理编码的原始查询字符串?注意 - Firefox 使用 UTF-8Latin-1 编码 - 但不能同时使用两者。所以我的计划是尝试使用 UTF-8 手动解码,然后查找“无效”字符 (FFFD),如果找到 - 尝试 Latin-1 解码。

例子:

Firefox 编码如下:

-                                          v   v
http://localhost:8041/Reforge.aspx?name=ArcânisГ 
Firefox turns into  
http://localhost:8041/Reforge.aspx?name=Arc%C3%A2nis%D0%93`  

请注意,UTF8编码用于两个非 ASCII 字符。

-                                          v
http://localhost:8041/Reforge.aspx?name=Arcâ
Firefox turns into
http://localhost:8041/Reforge.aspx?name=Arc%E2

请注意,ISO-8859-1(Latin-1)编码用于非 ASCII 字符。

4

1 回答 1

0

这是我的工作解决方案,有什么改进的方法吗?具体来说,我宁愿扩展框架而不是在动作本身内部处理它。

    private string DecodeNameParameterFromQuery(string query) {
        string nameUtf8 = HttpUtility.ParseQueryString(query, Encoding.UTF8)["name"];
        const char invalidUtf8Character = (char) 0xFFFD;
        if (nameUtf8.Contains(invalidUtf8Character)) {
            const int latin1 = 0x6FAF;
            var nameLatin1 = HttpUtility.ParseQueryString(query, Encoding.GetEncoding(latin1))["name"];
            return nameLatin1;
        }
        return nameUtf8;
    }
于 2010-11-15T18:31:37.497 回答