Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 22544|Odpowiedź: 0

[Źródło] Żądanie c# otrzymuje zniekształcone znaki dla parametrów

[Skopiuj link]
Opublikowano 25.12.2015 18:41:49 | | | |


Dziś rano kolega zadał mi pytanie: powiedziałem, że otrzymane parametry są zniekształcone, pozwól, że pomogę to rozwiązać.


Platforma, za którą odpowiada mój kolega, jest zbudowana Ext.js frameworku, a plik konfiguracyjny web.config skonfigurowany jest z globalnym kodowaniem "GB2312":

<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>

Gdy frontend wysyła "tekst chiński", backend otrzymuje zniekształcone znaki z Request.QueryString["xxx"].

Bez względu na to, jak dekodujesz za pomocą System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), to nie działa.

Opis zasady:
1: Pierwszą rzeczą, którą należy ustalić, jest to, że po przesłaniu parametrów URL klienta Ext.js je zakoduje przed przesłaniem, a kodowanie klienta jest domyślnie kodowane UTF-8


2: Dlaczego więc jest zniekształcony przy odbieraniu parametrów za pomocą Request.QueryString["xxx"]?

Krok po kroku odwracamy kompilację,
2.1: Sprawdź kod właściwości QueryString:


2.2: Wycięcie metody FillInQueryStringCollection()


2.3: Cięcie: QueryStringEncoding

Z kodu QueryStringEncoding system domyślnie przyjmuje metodę kodowania węzła konfiguracyjnego globalizacji, a jeśli nie, domyślnym jest kodowanie UTF-8
2.4: Wycięte do FillFromString (string s, bool urlencoded, kodowanie kodowania)

Od tego momentu okazuje się, że wszystkie parametry wejściowe są wywoływane raz: HttpUtility.UrlDecode(str2, encoding);

Gdy klient js przesyła chiński do serwera w kodowaniu utf-8, po odbieraniu go za pomocą Request.QueryString najpierw dekoduje go raz za pomocą gb2312 skonfigurowanego przez globalizację, co skutkuje zniekształconymi znakami.

1: Metoda kodowania JS to URT-8

2: Strona serwera skonfigurowała domyślnie GB2312

3: Request.QueryString domyślnie wywołuje HttpUtility.UrlDecode, aby zdekodować odebrane parametry z kodowaniem konfiguracji systemu.

1: System wybiera domyślne kodowanie w następującej kolejności: nagłówek HTTP request - >węzeł konfiguracji globalizacji - domyślny UTF-8

2: Przy wpisaniu adresu URL bezpośrednio w języku chińskim, różne przeglądarki mogą obsługiwać go inaczej, na przykład: IE nie koduje i wysyła bezpośrednio URL, Firefox wysyła URL po kodowaniu GB2312.

3: Dla niezakodowanych "znaków chińskich", po użyciu wewnętrznego Request.QueryString wywołaj HttpUtility.UrlDecode, by gb2312->utf-8,

Jeśli znak chiński nie zostanie znaleziony, zostanie domyślnie zamieniony na "%ufffd", co skutkuje nieodwracalnymi zniekształconymi znakami.

4: Droga do rozwiązania
Znając zasadę, istnieje wiele sposobów na jej rozwiązanie:
1: Globalne zjednoczenie to kodowanie UTF-8, co oszczędza kłopotów i zmartwień.

2: Gdy GB2312 jest globalnie określony, adres URL jest chiński, a js musi być zakodowany, na przykład ext.js framework.

W ten sposób możesz obsługiwać go tylko specjalnie, określając kodowanie i dekodowanie po stronie serwera.
Ponieważ domyślny system wywołuje HttpUtility.UrlDecode ("xxx", kodowanie konfiguracji systemowej) raz,
Więc ponownie wywołujesz HttpUtility.UrlEncode ("xxx", kodowanie skonfigurowane przez system), aby wrócić do oryginalnego parametru kodowania urt-8

Następnie użyj HttpUtility.UrlDecode("xxx", utf-8) do dekodowania.
String aaa = żądanie. Request.QueryString["admin"];    Właściciel domu
                            string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312"));
                            string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);








Poprzedni:Cześć
Następny:Co za algorytm, jestem przygnębiony od kilku dni.
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com