Σήμερα το πρωί μου έκανε μια ερώτηση ένας συνάδελφος: Είπα ότι οι παράμετροι που ελήφθησαν ήταν αλλοιωμένες, επιτρέψτε μου να βοηθήσω στην επίλυσή του.
Η πλατφόρμα για την οποία είναι υπεύθυνος ο συνάδελφός μου είναι χτισμένη Ext.js πλαίσιο και το αρχείο διαμόρφωσης web.config έχει διαμορφωθεί με την καθολική κωδικοποίηση "GB2312":
<αίτημα παγκοσμιοποίησηςEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Όταν το frontend υποβάλλει το "Κινεζικό κείμενο", το backend λαμβάνει αλλοιωμένους χαρακτήρες με Request.QueryString["xxx"].
Ανεξάρτητα από το πώς αποκωδικοποιείτε με το System.Web.HttpUtility.UrlDecode("xxx", "τύπος κωδικοποίησης"), δεν λειτουργεί.
Περιγραφή αρχής: 1: Το πρώτο πράγμα που πρέπει να προσδιορίσετε είναι ότι όταν υποβάλλονται οι παράμετροι URL του πελάτη, Ext.js θα τις κωδικοποιήσει πριν τις υποβάλει και η κωδικοποίηση του πελάτη είναι κωδικοποίηση UTF-8 από προεπιλογή
2: Τότε γιατί είναι αλλοιωμένο κατά τη λήψη παραμέτρων με το Request.QueryString["xxx"];
Αντιστρέφουμε τη συλλογή βήμα προς βήμα, 2.1: Κοιτάξτε τον κώδικα για την ιδιότητα QueryString:
2.2: Κόψτε στη μέθοδο FillInQueryStringCollection().
2.3: Αποκοπή: QueryStringEncoding
Από τον κώδικα QueryStringEncoding, το σύστημα χρησιμοποιεί από προεπιλογή τη μέθοδο κωδικοποίησης του κόμβου ρύθμισης παραμέτρων παγκοσμιοποίησης και, εάν όχι, η προεπιλογή είναι η κωδικοποίηση UTF-8 2.4: Περικοπή σε FillFromString (συμβολοσειρά s, bool urlencoded, κωδικοποίηση κωδικοποίησης)
Από αυτό το σημείο διαπιστώνουμε ότι όλες οι είσοδοι παραμέτρων καλούνται μία φορά: HttpUtility.UrlDecode(str2, κωδικοποίηση);
Όταν το client js υποβάλλει κινέζικα στον διακομιστή σε κωδικοποίηση utf-8, όταν το λαμβάνει με το Request.QueryString, θα το αποκωδικοποιήσει πρώτα μία φορά με το gb2312 που έχει διαμορφωθεί από την παγκοσμιοποίηση, με αποτέλεσμα αλλοιωμένους χαρακτήρες.
1: Η μέθοδος κωδικοποίησης JS είναι URT-8
2: Η πλευρά του διακομιστή έχει διαμορφώσει την προεπιλογή σε GB2312
3: Το Request.QueryString θα καλέσει το HttpUtility.UrlDecode από προεπιλογή για να αποκωδικοποιήσει τις ληφθείσες παραμέτρους με κωδικοποίηση ρύθμισης παραμέτρων συστήματος.
1: Το σύστημα επιλέγει την προεπιλεγμένη κωδικοποίηση με την ακόλουθη σειρά: κεφαλίδα αιτήματος http - κόμβος διαμόρφωσης >globalization - προεπιλεγμένο UTF-8
2: Κατά την εισαγωγή της διεύθυνσης URL απευθείας στα κινέζικα, διαφορετικά προγράμματα περιήγησης ενδέχεται να τη χειρίζονται διαφορετικά, για παράδειγμα: Ο IE δεν κωδικοποιεί και υποβάλλει απευθείας, ο Firefox υποβάλλει τη διεύθυνση URL μετά την κωδικοποίηση GB2312.
3: Για μη κωδικοποιημένους "κινεζικούς χαρακτήρες", μετά τη χρήση της εσωτερικής κλήσης Request.QueryString HttpUtility.UrlDecode, από το gb2312->utf-8,
Εάν ο κινεζικός χαρακτήρας δεν βρεθεί, θα μετατραπεί σε "%ufffd" από προεπιλογή, με αποτέλεσμα μη αναστρέψιμους αλλοιωμένους χαρακτήρες.
4: Ο δρόμος προς την επίλυση Γνωρίζοντας την αρχή, υπάρχουν πολλοί τρόποι για να το λύσετε: 1: Η παγκόσμια ενοποίηση είναι η κωδικοποίηση UTF-8, η οποία γλιτώνει από προβλήματα και ανησυχίες.
2: Όταν το GB2312 καθορίζεται καθολικά, η διεύθυνση url είναι κινέζικη και το js πρέπει να κωδικοποιηθεί, όπως ext.js πλαίσιο.
Με αυτόν τον τρόπο, μπορείτε να το χειριστείτε μόνο ειδικά, καθορίζοντας την κωδικοποίηση και την αποκωδικοποίηση από την πλευρά του διακομιστή. Επειδή το προεπιλεγμένο σύστημα καλεί το HttpUtility.UrlDecode ("xxx", την κωδικοποίηση της διαμόρφωσης του συστήματος) μία φορά, Έτσι, καλείτε ξανά το HttpUtility.UrlEncode("xxx", την κωδικοποίηση που έχει διαμορφωθεί από το σύστημα) για να επιστρέψετε στην αρχική παράμετρο κωδικοποίησης urt-8
Στη συνέχεια, χρησιμοποιήστε το HttpUtility.UrlDecode("xxx", utf-8) για να το αποκωδικοποιήσετε. συμβολοσειρά aaa = αίτημα. Request.QueryString["admin"]; Ιδιοκτήτης σπιτιού συμβολοσειρά a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); συμβολοσειρά a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|