Vamos dar uma olhada nas duas URLs a seguir, elas atendem aos mesmos parâmetros? aaa.aspx?tag=.net%BC%BC%CA%F5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Parece ser diferente, mas na verdade, todos usam UrlEncode para "tecnologia .net", mas um é codificação GB2312 e o outro é codificação Utf-8. O código a seguir pode obter o efeito de codificação acima:
string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); string tmp2 = System.Web.HttpUtility.UrlEncode (".net technology", System.Text.Encoding.UTF8);
Nossas páginas reais podem ser chamadas por outros programas. Por exemplo, se uma página ASP no sistema operacional Simplificada em chinês precisa passar um parâmetro chinês para uma página ASP.net. Por padrão, em sistemas operacionais simplificados chineses, o método Server.UrlEncode do ASP codifica chinês com codificação GB2312. Mas, por padrão, ASP.net páginas são codificadas em UTF-8. Nesse caso, quando você usa Request.QueryString["Tag"] para aceitar o valor, você não poderá aceitar informações em chinês, e verá caracteres distorcidos na depuração passo a passo. Neste momento, embora Request.QueryString["Tag"] seja aceito com caracteres distorcidos, a URL neste momento não está distorcida.
A solução é analisar os parâmetros na URL por conta própria e então decifrar os valores dos parâmetros de acordo com a codificação do GB2312, em vez de usar a codificação padrão UTF-8 do .net. Na verdade, a Microsoft também fornece funções correspondentes, então não precisamos usar expressões regulares para analisar cadeias de URL por conta própria.
O código da demonstração é o seguinte:
string q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Resposta.Escrever(nv["Tag"]);
Vamos usar o .NET Reflector do Lutz Roeder para analisar a implementação do método System.Web.HttpUtility.ParseQueryString: Se continuarmos voltando, podemos ver que o código que finalmente gerencia a análise de string de parâmetros de URL é o seguinte:
A seguinte função da classe System.Web.HttpValueCollection implementa a análise do parâmetro URL Aqui vemos que é uma análise realizada por cada personagem.
Quanto ao tipo de método de codificação que a outra parte nos passa, o melhor é passá-lo como parâmetro, para que possamos descriptografá-lo de acordo com esse parâmetro do usuário. |