开发者

ASP.NET MVC does not understand mixed url encoding (UTF-8/Latin-1)

I have two URLs with parameters

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

In first URL Firefox encodes last charecter (Г) as %D0%93 (correctly in UTF-8). In second URL Firefox encodes last character (ì) as %EC (correctly in ISO-8859-1)

ASP.NET MVC can be configured using element in web.config to either assume UTF-8 or ISO-8859-1. But Firefox flips between encodings depending on the context.

Note that UTF-8 can be unambiguously distinguished from Latin-1 encoding.

Is there a way to teach ASP.NET MVC to decode 开发者_运维问答parameter values using either one of the formats?

EDIT: Is there a class that I could use to decode raw query string that would handle encoding correctly? Note - Firefox uses either UTF-8 or Latin-1 encoding - but not both at the same time. So my plan is to try decode manually using UTF-8 and then look for "invalid" character (FFFD), if one is found - try Latin-1 decode.

Example:

Firefox encodes as following:

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

Notice that UTF8 encoding is used for both non-ASCII characters.

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

Notice that ISO-8859-1 (Latin-1) encoding is used for the non-ASCII character.


Here is my working solution, any way to improve on it? Specifically I would rather extend framework instead of handling it inside an action itself.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜