1: Formulir mengirimkan data di latar depan dalam mode posting:
Ketika browser mengirimkan data (diasumsikan sebagai "China") ke server, ia harus mencari tabel kode saat mengubah data menjadi data biner 0101 (diasumsikan 98 99). Tabel kode mana yang digunakan browser untuk membuka halaman web, browser akan menggunakan tabel kode mana untuk mengirimkan data. Setelah data mencapai server, data (98 99) harus dienkapsulasi ke dalam permintaan. Memanggil metode getParameter dari Permintaan di servlet akan mengembalikan string ("China"). diubah menjadi karakter. Pastikan untuk memeriksa kodenya. Tabel, karena perancang permintaan adalah orang asing, kueri defaultnya adalah ISO8859-1, yang biasa digunakan oleh mereka.
Copy kode kodenya sebagai berikut:
paket com.yyz.request;
impor java.io.IOException;
impor java.io.PrintWriter;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServlet;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
//Kirim formulir dalam mode posting
kelas publik RequestDemo memperluas HttpServlet {
public void doGet (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
//Masalah permintaan data yang kacau di China
request.setCharacterEncoding("UTF-8");//Kami mengontrol halaman web klien menjadi UTF-8
String nama pengguna = permintaan.getParameter("nama pengguna");
//Mendapatkan data adalah hal yang normal, Anda dapat memeriksa tabel kode yang berbeda saat mengeluarkan data
respon.setCharacterEncoding("gb2312");//Beri tahu server tabel kode untuk berkonsultasi saat mengirim data
respon.setContentType("text/html;charset=gb2312");//Beri tahu browser dengan tabel kode mana yang akan dibuka
PrintWriter keluar = respon.getWriter();
out.write(nama pengguna);
}
public void doPost (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
doGet(permintaan,tanggapan);
}
2: Formulir mengirimkan data di latar depan dalam mode dapatkan:
Data yang dikirimkan pada metode get tetap dikirimkan menggunakan tabel kode yang digunakan browser untuk membukanya. Perbedaannya adalah ketika mengirimkan data dalam mode get, pengkodean pengaturan permintaan tidak valid. Meskipun UTF-8 disetel, ISO8859-1 akan tetap diperiksa. Dapatkan (??). Untuk mengatasi masalah ini, Anda perlu menggunakan (??) untuk memeriksa ISO8859-1 secara terbalik. Setelah mendapatkan (98 99), periksa tabel kode yang benar.
Copy kode kodenya sebagai berikut:
paket com.yyz.request;
impor java.io.IOException;
impor java.io.PrintWriter;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServlet;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
//Kirim formulir melalui metode get
kelas publik RequestDemo memperluas HttpServlet {
public void doGet (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
//Masalah permintaan data yang kacau di China
request.setCharacterEncoding("UTF-8");//Saat mengirimkan data dalam mode dapatkan, pengkodean pengaturan permintaan tidak valid. Meskipun UTF-8 disetel, ISO8859-1 akan tetap diperiksa.
String nama pengguna = permintaan.getParameter("nama pengguna");
System.out.println(nama pengguna);
sumber byte [] = nama pengguna.getBytes("iso8859-1");
nama pengguna = String baru (sumber,"UTF-8");
System.out.println(nama pengguna);
}
public void doPost (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
doGet(permintaan,tanggapan);
}
}
Tiga: Ringkasan masalah karakter Cina yang kacau dalam data yang dikirimkan:
1. Jika metode pengirimannya adalah post, Anda hanya perlu mengatur pengkodean objek permintaan jika Anda ingin menghindari karakter yang kacau.
Catatan: Cara pengiriman data klien bergantung pada pengkodean permintaan yang harus disetel.
2. Jika metode pengiriman didapat, pengaturan pengkodean objek permintaan tidak valid. Jika Anda ingin menghindari karakter yang kacau, Anda hanya dapat mengonversinya secara manual.
String data = "???????";//string kacau
byte source [] = data.getBytes("iso8859-1");//Dapatkan data asli yang dikirimkan oleh klien
data = new String (data.getBytes("iso8859-1"),,"UTF-8");//menyelesaikan karakter yang kacau
//Sama dengan
data = String baru (sumber,"UTF-8");
3. Kode kacau dalam metode get juga dapat dicapai dengan mengubah konfigurasi server. Ubah file server.xml di direktori conf Tomact.
3.1
Pendekatan ini tidak disarankan karena mengubah server dan tidak fleksibel.
3.2
Setelah pengaturan ini, pengkodean apa pun yang disetel berdasarkan setCharacterEncoding permintaan akan digunakan oleh konektor. Meskipun lebih fleksibel dibandingkan perubahan sebelumnya, hal ini tetap akan menyebabkan aplikasi kita sangat bergantung pada server, dan tidak disarankan.
Keempat: Terakhir, izinkan saya menyebutkan detail kecil: jika alamat URL diikuti dengan data berbahasa Mandarin, maka URL tersebut harus dikodekan. Parameter yang dikirimkan dalam formulir mencakup data berbahasa Mandarin, dan browser akan secara otomatis membantu kami menyandikannya. Namun, jika parameter berbahasa Mandarin langsung dibawa melalui tautan, browser tidak akan membantu kami menyandikannya masalah karakter Cina yang kacau melalui cara kedua di atas. Terkadang tidak berhasil. Anda harus mengkodekannya terlebih dahulu melalui URLEncoding.encode(,"UTF-8").