Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 22544|Απάντηση: 0

[Πηγή] c# Το αίτημα λαμβάνει αλλοιωμένους χαρακτήρες για παραμέτρους

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 25/12/2015 6:41:49 μ.μ. | | | |


Σήμερα το πρωί μου έκανε μια ερώτηση ένας συνάδελφος: Είπα ότι οι παράμετροι που ελήφθησαν ήταν αλλοιωμένες, επιτρέψτε μου να βοηθήσω στην επίλυσή του.


Η πλατφόρμα για την οποία είναι υπεύθυνος ο συνάδελφός μου είναι χτισμένη 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);








Προηγούμενος:Γεια σου
Επόμενος:Τι αλγόριθμος, έχω κατάθλιψη εδώ και αρκετές μέρες.
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com