ฉันพัฒนาโดยใช้ eclipse3.2+j2ee5.0 +tomcat5.09+mysql5.0
อันดับแรก ข้อมูลภาษาจีนที่อ่านไม่ออกในรูปแบบ POST สามารถแก้ไขได้
ในแบบเรียลไทม์ผ่านตัวกรอง รหัสตัวกรองมีดังนี้:
ตัวกรองแพ็คเกจ
นำเข้า java.io.IOException;
นำเข้า javax.servlet.Filter;
นำเข้า javax.servlet.FilterChain;
นำเข้า javax.servlet.FilterConfig;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.ServletRequest;
นำเข้า javax.servlet.ServletResponse;
นำเข้า javax.servlet.UnavailableException;
คลาสสาธารณะ SetCharacterEncodingFilter ใช้ตัวกรอง ...{
การเข้ารหัสสตริงที่ได้รับการป้องกัน = null;
ป้องกัน FilterConfig filterConfig = null;
บูลีนที่ได้รับการป้องกันละเว้น = จริง;
โมฆะสาธารณะทำลาย () ... {
นี้.การเข้ารหัส = null;
this.filterConfig = โมฆะ;
}
โมฆะสาธารณะ doFilter (คำขอ ServletRequest, การตอบสนอง ServletResponse,
โซ่กรองโซ่)
พ่น IOException, ServletException ...{
// เลือกแบบมีเงื่อนไขและตั้งค่าการเข้ารหัสอักขระที่จะใช้
ถ้า (ละเว้น || (request.getCharacterEncoding() == null)) ...{
การเข้ารหัสสตริง = selectEncoding (คำขอ);
ถ้า (เข้ารหัส != null)
request.setCharacterEncoding (การเข้ารหัส);
}
// ส่งต่อการควบคุมไปยังตัวกรองถัดไป
chain.doFilter(คำขอ การตอบสนอง);
}
public void init(FilterConfig filterConfig) พ่น ServletException ...{
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("การเข้ารหัส");
ค่าสตริง = filterConfig.getInitParameter("ignore");
ถ้า (ค่า == เป็นโมฆะ)
this.ignore = จริง;
อย่างอื่นถ้า (value.equalsIgnoreCase("true"))
this.ignore = จริง;
อย่างอื่นถ้า (value.equalsIgnoreCase("yes"))
this.ignore = จริง;
อื่น
this.ignore = false;
}
สตริงที่ได้รับการป้องกัน selectEncoding (คำขอ ServletRequest) ... {
กลับ (this.encoding);
}
}
การกำหนดค่าตัวกรอง (การกำหนดค่า web.xml):
<ตัวกรอง>
<ชื่อตัวกรอง>ตั้งค่าการเข้ารหัสอักขระ<//ชื่อตัวกรอง>
<คลาสตัวกรอง>ตัวกรองSetCharacterEncodingFilter</คลาสตัวกรอง>
<พารามิเตอร์เริ่มต้น>
<ชื่อพารามิเตอร์>การเข้ารหัส</ชื่อพารามิเตอร์>
<ค่าพารามิเตอร์> GBK </ค่าพารามิเตอร์>
</init-param>
</ตัวกรอง>
<การแมปตัวกรอง>
<ชื่อตัวกรอง>ตั้งค่าการเข้ารหัสอักขระ<//ชื่อตัวกรอง>
<รูปแบบ URL>/*</รูปแบบ URL>
</การทำแผนที่ตัวกรอง><
2. ปัญหาของอักขระที่อ่านไม่ออกเมื่อจัดเก็บข้อมูลภาษาจีนลงในฐานข้อมูล
เป็นตัวอย่างใน mysql เพียงเขียนสตริงการเชื่อมต่อใหม่:
jdbc:mysql://localhost:3306/workshopdb? useUnicode=true&CharacterEncoding=GBK
3. ปัญหาในการส่งพารามิเตอร์ผ่าน URL และการระบุชื่อไฟล์ภาษาจีน
. อาการของปัญหา: 1. การส่งพารามิเตอร์ผ่าน URL เช่น:
http://localhost:81/crjy/admin/articlelist.jsp?levelId=64&levelName =Student อาคารปาร์ตี้
ค่าที่ได้รับผ่าน request.getParameter("levleName") คือ Ranma
2. จดจำชื่อไฟล์ภาษาจีน เช่น
<img src="./pic/Sichuan Map.jpg"> ไม่สามารถแสดงรูปภาพได้
วิธีแก้ไข:
1. หากคุณต้องการแก้ไขปัญหาแรกเท่านั้น โค้ดเพียงสองบรรทัดก็ง่ายมาก:
String Role=request.getParameter("chara");
Role=new String(role.getBytes("ISO-8859-1"),"GB2312");
out.println(บทบาท);
เนื่องจากเซิร์ฟเวอร์ Tomcat ใช้อักขระ ISO-8859-1 ที่ตั้งค่าไว้ตามค่าเริ่มต้น แต่นี้สามารถแก้ปัญหาแรกได้เท่านั้น แต่ไม่ใช่ปัญหาชื่อไฟล์ภาษาจีน
2. แก้ไขปัญหาทั้งสองร่วมกัน แก้ไข server.xml ค้นหาคำสั่งต่อไปนี้และเพิ่ม URIEncoding="GB18030" เพื่อให้ทั้งสองปัญหาได้รับการแก้ไขร่วมกัน ( ไม่จำเป็นต้องมีบทบาท) =new String(role.getBytes("ISO-8859-1"),"GB2312"); การแปลง, พารามิเตอร์ที่ได้รับเป็นภาษาจีนปกติ)
<Connector AcceptCount="100" ConnectionTimeout="20000" debug=" 0" DisableUploadTimeout = "true" EnableLookups = "false" maxSpareThreads = "75" maxThreads = "150" minSpareThreads = "25" พอร์ต = "81" เปลี่ยนเส้นทางพอร์ต = "8443"/>
นอกจากนี้ หลายบทความแนะนำว่าคุณสามารถเพิ่ม URIEncoding="UTF-8" ซึ่งสามารถแก้ปัญหาชื่อไฟล์ภาษาจีนได้ แต่เมื่อคุณได้รับพารามิเตอร์ที่ส่งผ่านโดย url ผ่าน String Role=request.getParameter("chara"); คุณได้รับการเข้ารหัส UTF-8 จะต้องแปลงเป็น GB2312 ซึ่งยุ่งยาก
ข้างต้นคือบทสรุปการใช้งานของฉัน ฉันหวังว่าทุกคนจะสามารถแสดงความคิดเห็นอันมีค่าได้
http://blog.csdn.net/lijiuu/archive/2007/02/25/1514354.aspx