Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 22544|Jawab: 0

[Sumber] c# Permintaan menerima karakter kacau untuk parameter

[Salin tautan]
Diposting pada 25/12/2015 18.41.49 | | | |


Pagi ini saya ditanyai pertanyaan oleh seorang kolega: Saya mengatakan bahwa parameter yang diterima kacau, izinkan saya membantu menyelesaikannya.


Platform yang menjadi tanggung jawab kolega saya dibuat Ext.js kerangka kerja, dan file konfigurasi web.config dikonfigurasi dengan pengkodean "GB2312" global:

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

Saat frontend mengirimkan "teks Cina", backend menerima karakter kacau dengan Request.QueryString["xxx"].

Tidak peduli bagaimana Anda memecahkan kode dengan System.Web.HttpUtility.UrlDecode("xxx", "jenis pengkodean"), itu tidak berfungsi.

Deskripsi prinsip:
1: Hal pertama yang harus ditentukan adalah ketika parameter URL klien dikirimkan, Ext.js akan mengkodekannya sebelum mengirimkannya, dan pengkodean klien adalah pengkodean UTF-8 secara default


2: Lalu mengapa kacau saat menerima parameter dengan Request.QueryString["xxx"]?

Kami membalikkan kompilasi selangkah demi selangkah,
2.1: Lihat kode untuk properti QueryString:


2.2: Potong ke dalam metode FillInQueryStringCollection()


2.3: Potong: QueryStringEncoding

Dari kode QueryStringEncoding, sistem default ke metode pengodean simpul konfigurasi globalisasi, dan jika tidak, defaultnya adalah pengodean UTF-8
2.4: Potong menjadi FillFromString (string s, bool urlencoded, Pengkodean pengkodean)

Dari titik ini kita menemukan bahwa semua input parameter dipanggil sekali: HttpUtility.UrlDecode(str2, pengkodean);

Ketika klien js mengirimkan bahasa Cina ke server dalam pengkodean utf-8, saat menerimanya dengan Request.QueryString, pertama-tama akan memecahkan kodenya sekali dengan gb2312 yang dikonfigurasi oleh globalisasi, menghasilkan karakter yang kacau.

1: Metode pengkodean JS adalah URT-8

2: Sisi server telah mengonfigurasi default ke GB2312

3: Request.QueryString akan memanggil HttpUtility.UrlDecode secara default untuk memecahkan kode parameter yang diterima dengan pengkodean konfigurasi sistem.

1: Sistem memilih pengkodean default dalam urutan berikut: header permintaan http - >node konfigurasi globalisasi - UTF-8 default

2: Saat memasukkan URL langsung ke bahasa Cina, browser yang berbeda dapat menanganinya secara berbeda, misalnya: IE tidak mengkodekan dan mengirimkan secara langsung, Firefox mengirimkan URL setelah pengkodean GB2312.

3: Untuk "karakter Cina" yang tidak dikodekan, setelah menggunakan panggilan internal Request.QueryString HttpUtility.UrlDecode, oleh gb2312->utf-8,

Jika karakter Cina tidak ditemukan, itu akan diubah menjadi "%ufffd" secara default, menghasilkan karakter kacau yang tidak dapat diubah.

4: Jalan menuju resolusi
Mengetahui prinsipnya, ada banyak cara untuk menyelesaikannya:
1: Penyatuan global adalah pengkodean UTF-8, yang menghemat masalah dan kekhawatiran.

2: Ketika GB2312 ditentukan secara global, urlnya adalah bahasa Cina, dan js harus dikodekan, seperti kerangka kerja ext.js.

Dengan cara ini, Anda hanya dapat menanganinya secara khusus, menentukan pengkodean dan decoding di sisi server.
Karena sistem default memanggil HttpUtility.UrlDecode("xxx", pengkodean konfigurasi sistem) sekali,
Jadi Anda memanggil HttpUtility.UrlEncode("xxx", pengkodean yang dikonfigurasi oleh sistem) lagi untuk kembali ke parameter pengkodean urt-8 asli

Kemudian gunakan HttpUtility.UrlDecode("xxx", utf-8) untuk memecahkan kodenya.
string aaa = permintaan. Request.QueryString["admin"];    Pemilik rumah
                            string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312"));
                            string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);








Mantan:Hai
Depan:Sungguh algoritma, saya telah tertekan selama beberapa hari.
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com