Esta manhã, um colega me fez uma pergunta: eu disse que os parâmetros recebidos estavam distorcidos, deixe-me ajudar a resolver.
A plataforma pela qual meu colega é responsável é construída Ext.js framework, e o arquivo de configuração web.config está configurado com a codificação global "GB2312":
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Quando o frontend envia o "texto chinês", o backend recebe caracteres distorcidos com Request.QueryString["xxx"].
Não importa como você decodifica com System.Web.HttpUtility.UrlDecode("xxx", "tipo de codificação"), isso não funciona.
Descrição do princípio: 1: A primeira coisa a determinar é que, quando os parâmetros da URL do cliente são enviados, Ext.js os codificará antes de enviá-los, e a codificação do cliente é codificação UTF-8 por padrão
2: Então por que está distorcido ao receber parâmetros com Request.QueryString["xxx"]?
Invertemos a compilação passo a passo, 2.1: Veja o código da propriedade QueryString:
2.2: Corte no método FillInQueryStringCollection()
2.3: Corte: QueryStringEncoding
A partir do código QueryStringEncoding, o sistema adota por padrão o método de codificação do nó de configuração de globalização e, se não o fizer, o padrão é a codificação UTF-8 2.4: Cortar em FillFromString (string s, bool urlencoded, codificação de codificação)
A partir desse ponto, descobrimos que todas as entradas de parâmetros são chamadas uma vez: HttpUtility.UrlDecode(str2, codificação);
Quando o js cliente envia chinês ao servidor na codificação utf-8, ao recebê-lo com Request.QueryString, ele primeiro o decodifica uma vez com gb2312 configurado pela globalização, resultando em caracteres distorcidos.
1: O método de codificação JS é URT-8
2: O lado do servidor configurou o padrão para GB2312
3: Request.QueryString chamará HttpUtility.UrlDecode por padrão para decodificar os parâmetros recebidos com codificação de configuração do sistema.
1: O sistema seleciona a codificação padrão na seguinte ordem: cabeçalho de requisição http - nó de configuração >globalização - UTF-8 padrão
2: Ao inserir a URL diretamente no chinês, diferentes navegadores podem lidar com isso de formas distintas, por exemplo: IE não codifica e envia diretamente, o Firefox envia a URL após a codificação GB2312.
3: Para "caracteres chineses" não codificados, após usar a chamada interna Request.QueryString HttpUtility.UrlDecode, por gb2312->utf-8,
Se o caractere chinês não for encontrado, ele será convertido por padrão em "%ufffd", resultando em caracteres distorcidos irreversíveis.
4: O caminho para a resolução Conhecendo o princípio, existem muitas maneiras de resolvê-lo: 1: A unificação global é a codificação UTF-8, que evita problemas e preocupações.
2: Quando GB2312 é especificado globalmente, a URL é chinesa, e o js deve ser codificado, como ext.js framework.
Dessa forma, você só pode lidar com isso de forma especial, especificando a codificação e decodificação no lado do servidor. Como o sistema padrão chama HttpUtility.UrlDecode("xxx", a codificação da configuração do sistema) uma vez, Então você chama HttpUtility.UrlEncode ("xxx", a codificação configurada pelo sistema) novamente para retornar ao parâmetro original de codificação urt-8
Depois, use HttpUtility.UrlDecode("xxx", utf-8) para decodificar. string AAA = Solicitação. Request.QueryString["admin"]; Proprietário string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|