1

パラメータ付きの 2 つの URL があります

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

最初の URL では、Firefox は最後の文字 (Г) を %D0%93 (正確には UTF-8) としてエンコードします。2 番目の URL で、Firefox は最後の文字 (ì) を %EC としてエンコードします (ISO-8859-1 では正しく)

ASP.NET MVC は、web.config の要素を使用して、UTF-8 または ISO-8859-1 を想定するように構成できます。しかし、Firefox はコンテキストに応じてエンコーディングを切り替えます。

UTF-8 は、Latin-1 エンコーディングと明確に区​​別できることに注意してください。

いずれかの形式を使用してパラメーター値をデコードするように ASP.NET MVC に教える方法はありますか?

編集:エンコーディングを正しく処理する生のクエリ文字列をデコードするために使用できるクラスはありますか? 注 - Firefox は UTF-8またはLatin-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 に答える