1: แบบฟอร์มส่งข้อมูลในเบื้องหน้าในโหมดโพสต์:
เมื่อเบราว์เซอร์ส่งข้อมูล (สมมุติว่าเป็น "จีน") ไปยังเซิร์ฟเวอร์ จะต้องค้นหาตารางโค้ดเมื่อเปลี่ยนข้อมูลเป็นข้อมูลไบนารี่ 0101 (สมมุติว่าเป็น 98 99) ตารางโค้ดใดที่เบราว์เซอร์ใช้ในการเปิด หน้าเว็บเบราว์เซอร์จะกำหนดรหัสตารางในการส่งข้อมูลด้วย หลังจากที่ข้อมูลมาถึงเซิร์ฟเวอร์ ข้อมูล (98 99) จะต้องถูกห่อหุ้มไว้ในคำขอ การเรียกเมธอด getParameter ของคำขอในเซิร์ฟเล็ตจะส่งคืนสตริง ("จีน") หลังจากได้รับหมายเลขภายในเมธอดแล้ว จะต้องเป็น แปลงเป็นอักขระ อย่าลืมตรวจสอบโค้ด เนื่องจากผู้ออกแบบคำขอเป็นชาวต่างชาติ คิวรีเริ่มต้นคือ ISO8859-1 ซึ่งมักใช้โดยพวกเขา นี่คือแหล่งที่มาของข้อมูลคำขอที่อ่านไม่ออก
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.yyz.request;
นำเข้า java.io.IOException;
นำเข้า java.io.PrintWriter;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.http.HttpServlet;
นำเข้า javax.servlet.http.HttpServletRequest;
นำเข้า javax.servlet.http.HttpServletResponse;
//ส่งแบบฟอร์มในโหมดโพสต์
RequestDemo คลาสสาธารณะขยาย HttpServlet {
โมฆะสาธารณะ doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
//ปัญหาข้อมูลคำขอที่อ่านไม่ออกของจีน
request.setCharacterEncoding("UTF-8");//เราควบคุมหน้าเว็บไคลเอนต์ให้เป็น UTF-8
ชื่อผู้ใช้สตริง = request.getParameter("ชื่อผู้ใช้");
//การรับข้อมูลเป็นเรื่องปกติ คุณสามารถตรวจสอบตารางโค้ดต่างๆ เมื่อส่งออกข้อมูลได้
response.setCharacterEncoding("gb2312");//แจ้งเตือนเซิร์ฟเวอร์ของตารางโค้ดเพื่อปรึกษาเมื่อส่งข้อมูล
response.setContentType("text/html;charset=gb2312");//แจ้งเบราว์เซอร์ด้วยตารางรหัสที่จะเปิด
PrintWriter ออก = response.getWriter();
out.write (ชื่อผู้ใช้);
-
โมฆะสาธารณะ doPost (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
doGet(ร้องขอ, ตอบกลับ);
-
2: แบบฟอร์มส่งข้อมูลในเบื้องหน้าในโหมดรับ:
ข้อมูลที่ส่งในวิธีการรับยังคงส่งโดยใช้ตารางรหัสที่เบราว์เซอร์ใช้ในการเปิด ข้อแตกต่างคือเมื่อส่งข้อมูลในโหมดรับ การเข้ารหัสการตั้งค่าคำขอไม่ถูกต้อง แม้ว่าจะตั้งค่า UTF-8 แล้ว ISO8859-1 จะยังคงถูกตรวจสอบ รับ (??) เพื่อแก้ไขปัญหานี้ คุณต้องใช้ (??) เพื่อตรวจสอบ ISO8859-1 แบบย้อนกลับ หลังจากได้รับ (98 99) แล้ว ให้ตรวจสอบตารางรหัสที่ถูกต้อง
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.yyz.request;
นำเข้า java.io.IOException;
นำเข้า java.io.PrintWriter;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.http.HttpServlet;
นำเข้า javax.servlet.http.HttpServletRequest;
นำเข้า javax.servlet.http.HttpServletResponse;
//ส่งแบบฟอร์มด้วยวิธีget
RequestDemo คลาสสาธารณะขยาย HttpServlet {
โมฆะสาธารณะ doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
//ปัญหาข้อมูลคำขอที่อ่านไม่ออกของจีน
request.setCharacterEncoding("UTF-8");//เมื่อส่งข้อมูลในโหมดรับ การเข้ารหัสการตั้งค่าคำขอไม่ถูกต้อง แม้ว่าจะตั้งค่า UTF-8 แล้ว ISO8859-1 จะยังคงถูกตรวจสอบ
ชื่อผู้ใช้สตริง = request.getParameter("ชื่อผู้ใช้");
System.out.println(ชื่อผู้ใช้);
แหล่งไบต์ [] = ชื่อผู้ใช้.getBytes("iso8859-1");
ชื่อผู้ใช้ = สตริงใหม่ (ที่มา "UTF-8");
System.out.println(ชื่อผู้ใช้);
-
โมฆะสาธารณะ doPost (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
doGet(ร้องขอ, ตอบกลับ);
-
-
สาม: สรุปปัญหาตัวอักษรจีนที่อ่านไม่ออกในข้อมูลที่ส่งมา:
1. หากวิธีการส่งเป็นการโพสต์ คุณจะต้องตั้งค่าการเข้ารหัสของออบเจ็กต์คำขอเท่านั้น หากคุณต้องการหลีกเลี่ยงอักขระที่อ่านไม่ออก
หมายเหตุ: วิธีการส่งข้อมูลไคลเอ็นต์จะขึ้นอยู่กับว่าควรตั้งค่าการเข้ารหัสใด
2. หากได้รับวิธีการส่ง การตั้งค่าการเข้ารหัสของออบเจ็กต์คำขอไม่ถูกต้อง หากคุณต้องการหลีกเลี่ยงอักขระที่อ่านไม่ออก คุณสามารถแปลงได้ด้วยตนเองเท่านั้น
String data = "????????";//สตริงที่อ่านไม่ออก
แหล่งไบต์ [] = data.getBytes("iso8859-1");//รับข้อมูลต้นฉบับที่ลูกค้าส่งมา
data = new String (data.getBytes("iso8859-1"),"UTF-8");//แก้ไขอักขระที่อ่านไม่ออก
//เท่ากับ.
ข้อมูล = สตริงใหม่ (แหล่งที่มา "UTF-8");
3. รหัสที่อ่านไม่ออกในวิธีการรับสามารถทำได้โดยการเปลี่ยนการกำหนดค่าเซิร์ฟเวอร์ เปลี่ยนไฟล์ server.xml ในไดเร็กทอรี conf ของ Tomact
3.1
ไม่แนะนำวิธีนี้เนื่องจากจะเปลี่ยนเซิร์ฟเวอร์และไม่ยืดหยุ่น
3.2
หลังจากการตั้งค่านี้ การเข้ารหัสใดก็ตามที่ตั้งค่าโดย setCharacterEncoding ของคำขอจะถูกใช้โดยตัวเชื่อมต่อ แม้ว่าจะมีความยืดหยุ่นมากกว่าการเปลี่ยนแปลงครั้งก่อน แต่ก็ยังทำให้แอปพลิเคชันของเราต้องพึ่งพาเซิร์ฟเวอร์อย่างแน่นหนา และไม่แนะนำ
สี่: สุดท้ายนี้ ผมขอพูดถึงรายละเอียดเล็กๆ น้อยๆ: ถ้าที่อยู่ URL ตามด้วยข้อมูลภาษาจีน ก็จะต้องมีการเข้ารหัส URL พารามิเตอร์ที่ส่งในแบบฟอร์มประกอบด้วยข้อมูลภาษาจีน และเบราว์เซอร์จะช่วยเราเข้ารหัสโดยอัตโนมัติ อย่างไรก็ตาม หากพารามิเตอร์ภาษาจีนถูกส่งผ่านลิงก์โดยตรง เบราว์เซอร์จะไม่ช่วยเราเข้ารหัส ในกรณีนี้ เราต้องการแก้ไข ปัญหาอักขระภาษาจีนที่อ่านไม่ออกด้วยวิธีที่สองข้างต้น บางครั้งอาจไม่ได้ผล คุณควรเข้ารหัสก่อนผ่าน URLEncoding.encode(,"UTF-8")