代码之家  ›  专栏  ›  技术社区  ›  THX-1138

ASP.NET MVC不理解混合url编码(UTF-8/Latin-1)

  •  1
  • THX-1138  · 技术社区  · 14 年前

    我有两个带参数的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可以明确地与拉丁语-1编码区分开来。

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

    编辑: 有没有一个类可以用来解码原始查询字符串以正确处理编码?注意-Firefox使用UTF-8 拉丁语-1编码-但不能同时使用。所以我的计划是尝试使用UTF-8手动解码,然后寻找“无效”字符(FFFD),如果找到一个-尝试拉丁-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 (拉丁语-1)编码用于非ASCII字符。

    1 回复  |  直到 14 年前
        1
  •  0
  •   THX-1138    14 年前

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

        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;
        }