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);
|