Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 22544|Resposta: 0

[Fonte] Solicitação c# recebe caracteres distorcidos para parâmetros

[Copiar link]
Publicado em 25/12/2015 18:41:49 | | | |


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








Anterior:Oi
Próximo:Que algoritmo, estou deprimido há vários dias.
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com