Ottenere U + fffd / 65533 invece del carattere speciale dalla stringa di query
-
03-07-2019 - |
Domanda
Ho un progetto web C # .net che ha un tag di globalizzazione impostato su:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="nb-no" uiCulture="no"/>
Quando questo URL è un'applicazione Flash (si ottiene lo stesso problema quando si immette l'URL manualmente in un browser): c_product_search.aspx? search = kj & # 248; kken (in alternativa: c_product_search-aspx? search = kj % F8kken
Entrambi restituiscono i seguenti codici carattere:
k U+006b 107
j U+006a 106
� U+fffd 65533
k U+006b 107
k U+006b 107
e U+0065 101
n U+006e 110
Non so molto sulla codifica dei caratteri, ma sembra che & # 248; è stato dato un carattere di sostituzione Unicode, giusto?
Ho provato a cambiare il tag di globalizzazione in:
<globalization requestEncoding="iso-8859-1" responseEncoding="utf-8" culture="nb-no" uiCulture="no"/>
Che ha fatto funzionare la richiesta. Tuttavia, ora, altre ricerche sulla mia pagina hanno smesso di funzionare.
Ho anche provato quanto segue con risultati simili:
NameValueCollection qs = HttpUtility.ParseQueryString(Request.QueryString.ToString(), Encoding.GetEncoding("iso-8859-1"));
string search = (string)qs["search"];
Cosa devo fare?
Cordiali saluti,
Nitech
Soluzione
Il problema deriva dalla combinazione Firefox / Asp.Net. Quando hai inserito manualmente un URL nella barra degli indirizzi di Firefox, se l'URL contiene caratteri francesi o svedesi, Firefox codificherà l'URL con & Quot; ISO-8859-1 & Quot; per impostazione predefinita.
Ma quando asp.net riceve un tale url, pensa che sia codificato utf-8 ... E i caratteri codificati diventano " U + fffd " ;. Non sono riuscito a trovare un modo in asp.net per rilevare che l'URL è & Quot; ISO-8859-1 & Quot ;. Request.Encoding è impostato su utf-8 ... :(
Esistono diverse soluzioni:
-
inserisci
<globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/>
nel tuo Web.config. Ma potresti incontrare altri problemi e la tua applicazione non sarà più standard (non funzionerà con lingue come il giapponese) ... E comunque, preferisco usare UTF-8! -
vai a about: config in Firefox e imposta il valore di
network.standard-url.encode-query-utf8
su true. Ora funzionerà per te (Firefox codificherà tutto il tuo URL con utf-8). Ma non per nessun altro ... -
La soluzione peggiore che potessi trovare era gestirla con il codice. Se la decodifica predefinita non ha funzionato, analizziamo QueryString con iso8859-1:
string query = Request.QueryString["search"]; if (query.Contains("%ufffd")) query = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("iso-8859-1"))["search"]; query = HttpUtility.UrlDecode(query);
Funziona con collegamenti ipertestuali e URL inserito manualmente, in francese, inglese o giapponese. Ma non so come gestirà altre codifiche come ISO8859-5 (russo) ...
Qualcuno ha una soluzione migliore?
Questo risolve solo il problema dell'URL inserito manualmente. Nei tuoi collegamenti ipertestuali, non dimenticare di codificare i parametri url con HttpUtility.UrlEncode sul server o codificareURIComponent sul codice javascript. E usa HttpUtility.UrlDecode per decodificarlo.
Altri suggerimenti
public string GetEncodedQueryString(string key)
{
string query = Request.QueryString[key];
if (query != null)
if (query.Contains((char)0xfffd))
query = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("iso-8859-1"))[key];
return query;
}
Penso che il tuo problema sia nel flash, non nel .net. invia il personaggio speciale in un modo strano. prova a urlencode la stringa di ricerca bevore che la mandi al server.
Se l'app prevede che la richiesta con codifica URL sia basata su UTF-8, il carattere " ø
" dovrebbe essere " %C3%B8
" ;, non " %F8
" ;. Qualunque funzione tu stia usando per scappare / codificare quella richiesta, probabilmente dovrai passare il nome della codifica del carattere sottostante, & Quot; UTF-8 & Quot ;.
Si scopre che ActionScript 2.0 invierà l'URL codificato / con escape con UTF-8 mentre ActionScript 3.0 utilizzava ISO-8859-1. Il modo per risolverlo era cambiare il valore Request.Encoding all'interno di Global.asax se nell'URL è stata specificata una codifica:
void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext ctx = HttpContext.Current;
// encoding specified?
if (!String.IsNullOrEmpty(Request["encoding"]))
{
ctx.Request.ContentEncoding = System.Text.Encoding.GetEncoding(ctx.Request["encoding"]);
}
}
Potrebbe essere fatto diversamente?
Saluti, Nitech