วิธีแก้ไขปัญหา jsp ที่อ่านไม่ออก
15-07-2552 10:32 น
1. สาเหตุที่เพจ JSP อ่านไม่ออกก็คือไม่ได้ระบุการเข้ารหัสชุดอักขระในเพจ วิธีแก้ไข: เพียงใช้โค้ดต่อไปนี้ที่จุดเริ่มต้นของเพจเพื่อระบุการเข้ารหัสชุดอักขระ <%@ page contentType= "ข้อความ /html; charset=gb2312"? %>
2. อักขระที่อ่านไม่ออกของฐานข้อมูลจะทำให้อักขระจีนที่คุณแทรกลงในฐานข้อมูลกลายเป็นอักขระที่อ่านไม่ออกหรืออักขระจีนที่คุณแทรกลงในฐานข้อมูลจะเป็นอักขระที่อ่านไม่ออกเมื่ออ่านและแสดงวิธีแก้ปัญหามีดังนี้ : :
เพิ่มชุดอักขระที่เข้ารหัสลงในสตริงการเชื่อมต่อฐานข้อมูล (เช่นเดียวกับการเชื่อมต่อแหล่งข้อมูล)
URL สตริง = "jdbc:mysql://localhost/digitgulf?
ผู้ใช้=root&password=root&useUnicode=true&CharacterEncoding=GB2312";
และใช้รหัสต่อไปนี้ในหน้า:
response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("gb2312");
3. อักขระที่อ่านไม่ออกเมื่อส่งผ่านภาษาจีนเป็นพารามิเตอร์ เมื่อเราส่งอักขระภาษาจีนเป็นพารามิเตอร์ไปยังหน้าอื่น อักขระที่อ่านไม่ออกจะปรากฏขึ้นเช่นกัน วิธีแก้ไขจะเป็นดังนี้:
เข้ารหัสพารามิเตอร์เมื่อส่งผ่านพารามิเตอร์ เช่น RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
จากนั้นใช้คำสั่งต่อไปนี้บนหน้าพารามิเตอร์การรับเพื่อรับ keywords=new String(request.getParameter("keywords").getBytes("8859_1"));
ปัญหาหลักของอักขระที่อ่านไม่ออกยังคงเป็นปัญหาของการเข้ารหัสชุดอักขระ ตราบใดที่สิ่งนี้เชี่ยวชาญ ปัญหาโค้ดที่อ่านไม่ออกทั่วไปก็สามารถแก้ไขได้
-
ตั้งแต่ฉันเข้ามาติดต่อกับ Java และ JSP ฉันก็ต้องจัดการกับปัญหาอักขระภาษาจีนที่อ่านไม่ออกใน Java ในที่สุด ตอนนี้เราจะแบ่งปันประสบการณ์การแก้ปัญหาของเรากับทุกคน
1. ที่มาของปัญหาภาษาจีนชวา
ไฟล์คอร์และคลาสของ Java นั้นมีพื้นฐานมาจากยูนิโค้ด ซึ่งทำให้โปรแกรม Java สามารถข้ามแพลตฟอร์มได้ดี แต่ยังนำมาซึ่งปัญหาบางอย่างกับอักขระที่อ่านไม่ออกของจีนด้วย มีสองสาเหตุหลัก: ปัญหาโค้ดที่อ่านไม่ออกที่เกิดจากการคอมไพล์ไฟล์ Java และ JSP เอง และปัญหาโค้ดที่อ่านไม่ออกที่เกิดจากการโต้ตอบของโปรแกรม Java กับสื่ออื่น
ประการแรก ไฟล์ต้นฉบับ Java (รวมถึง JSP) มีแนวโน้มที่จะมีภาษาจีน และวิธีการบันทึกของไฟล์ต้นฉบับ Java และ JSP จะขึ้นอยู่กับสตรีมไบต์ หาก Java และ JSP ถูกคอมไพล์เป็นไฟล์คลาส วิธีการเข้ารหัสที่ใช้จะแตกต่างออกไป ไฟล์ต้นฉบับ หากการเข้ารหัสไม่สอดคล้องกัน อักขระที่อ่านไม่ออกจะปรากฏขึ้น ตามโค้ดที่อ่านไม่ออกประเภทนี้ ขอแนะนำไม่ให้เขียนภาษาจีนในไฟล์ Java (ส่วนความคิดเห็นไม่มีส่วนร่วมในการคอมไพล์ ไม่สำคัญว่าคุณจะเขียนภาษาจีนหรือไม่) หากคุณต้องเขียน ให้ลองคอมไพล์ด้วยพารามิเตอร์ด้วยตนเอง -ecoding GBK หรือ -ecoding gb2312; สำหรับ JSP ในส่วนหัวของไฟล์ การเพิ่ม <%@ page contentType="text/html;charset=GBK"%> หรือ <%@ page contentType="text/html;charset=gb2312"% > โดยพื้นฐานแล้วสามารถแก้ปัญหาโค้ดที่อ่านไม่ออกประเภทนี้ได้
บทความนี้จะเน้นที่โค้ดที่อ่านไม่ออกประเภทที่สอง ซึ่งเป็นโค้ดที่อ่านไม่ออกที่สร้างขึ้นเมื่อโปรแกรม Java โต้ตอบกับสื่อบันทึกข้อมูลอื่นๆ สื่อบันทึกข้อมูลจำนวนมาก เช่น ฐานข้อมูล ไฟล์ สตรีม ฯลฯ จะขึ้นอยู่กับสตรีมแบบไบต์ เมื่อโปรแกรม Java โต้ตอบกับสื่อเหล่านี้ การแปลงระหว่างอักขระ (อักขระ) และไบต์ (ไบต์) จะเกิดขึ้น เช่น จากเพจ ข้อมูลที่ส่งในแบบฟอร์มการส่งจะแสดงอักขระที่อ่านไม่ออกในโปรแกรม Java
หากวิธีการเข้ารหัสที่ใช้ในกระบวนการแปลงข้างต้นไม่สอดคล้องกับการเข้ารหัสไบต์ดั้งเดิม อักขระที่อ่านไม่ออกก็มีแนวโน้มที่จะปรากฏขึ้น
2. วิธีแก้ปัญหา
สำหรับ Tomcat ยอดนิยม มีสองวิธีแก้ไข:
1) เปลี่ยน D:Tomcatconfserver.xml และระบุรูปแบบการเข้ารหัสของเบราว์เซอร์เป็น "จีนตัวย่อ":
วิธีการคือการค้นหา
<พอร์ตตัวเชื่อมต่อ = "8080" maxThreads = "150" minSpareThreads = "25" maxSpareThreads = "75"
EnableLookups = "เท็จ" เปลี่ยนเส้นทาง = "8443" ยอมรับCount = "100"
ConnectionTimeout = "20000" DisableUploadTimeout = "true" URIEncoding = 'GBK' />
แท็ก ข้อความตัวหนาเพิ่มโดยฉัน
คุณสามารถตรวจสอบว่าการเปลี่ยนแปลงของคุณสำเร็จหรือไม่: ก่อนทำการเปลี่ยนแปลง ในเบราว์เซอร์ IE ของคุณที่มีหน้าอ่านไม่ออก ให้คลิกเมนู "ดู | การเข้ารหัส" แล้วคุณจะพบว่าได้เลือก "ยุโรปตะวันตก (ISO)" ไว้ หลังจากการเปลี่ยนแปลง คลิกเมนู "ดู | การเข้ารหัส" แล้วคุณจะพบว่าได้เลือก "ภาษาจีนตัวย่อ (GB2312)" ไว้
b) อัปเดตโปรแกรม Java โปรแกรมของฉันเป็นดังนี้:
ThreeParams คลาสสาธารณะขยาย HttpServlet {
โมฆะสาธารณะ doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
response.setContentType("text/html; charset=GBK");
-
-
-
ต้องใช้แบบอักษรตัวหนา และฟังก์ชันคือการอนุญาตให้เบราว์เซอร์แปลงอักขระ Unicode เป็นอักขระ GBK ด้วยวิธีนี้ เนื้อหาของหน้าและโหมดการแสดงผลของเบราว์เซอร์จะถูกตั้งค่าเป็น GBK ดังนั้นจึงไม่มีอักขระที่อ่านไม่ออก
โซลูชั่นที่สมบูรณ์สำหรับภาษาจีนภายใต้ Tomcat
ฉันกำลังพัฒนาโปรเจ็กต์ทุกวันนี้ เซิร์ฟเวอร์คือ Tomcat ระบบปฏิบัติการคือบทความและความคิดเห็น ในที่สุดก็ทำได้ แต่ความทรงจำที่ดีนั้นไม่ดีเท่ากับปากกาแย่ ๆ ดังนั้นฉันจึงเขียนมันลงไปเพื่อป้องกันไม่ให้ตัวเองลืมและเพื่อเป็นข้อมูลอ้างอิงที่ดีสำหรับผู้ที่ประสบปัญหาเดียวกัน:
(1) หน้า JSP เป็นภาษาจีน แต่เมื่อดูแล้วจะอ่านไม่ออก:
วิธีแก้ไขคือใช้ <%@ page language="java" contentType="text/html;charset=GBK" %> ในการเข้ารหัสของเพจ JSP เนื่องจากปัญหาการเข้ารหัสเมื่อ Jsp ถูกแปลงเป็นไฟล์ Java โดย ค่าเริ่มต้นของเซิร์ฟเวอร์บางตัวคือ ISO-8859-1 หากป้อนภาษาจีนลงใน JSP โดยตรงจะมีปัญหาอย่างแน่นอนกับ Jsp ที่ใช้เป็น ISO8859-1 เราสามารถยืนยันสิ่งนี้ได้โดยดูที่ไฟล์ระดับกลาง Java ที่สร้างโดย Jasper
(2) เมื่อใช้วัตถุ Request เพื่อรับรหัสตัวอักษรจีนที่ลูกค้าส่งมา ตัวอักษรที่อ่านไม่ออกจะปรากฏขึ้น:
วิธีแก้ไขคือการกำหนดค่าตัวกรองซึ่งเป็นตัวกรอง Servelet โดยมีโค้ดดังนี้:
นำเข้า java.io.IOException;
นำเข้า javax.servlet.Filter;
นำเข้า javax.servlet.FilterChain;
นำเข้า javax.servlet.FilterConfig;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.ServletRequest;
นำเข้า javax.servlet.ServletResponse;
CharacterEncodingFilter คลาสสาธารณะใช้ตัวกรอง {
การกำหนดค่า FilterConfig ส่วนตัว
การเข้ารหัสสตริงส่วนตัว = "ISO8859_1";
โมฆะสาธารณะทำลาย () {
System.out.println(กำหนดค่า);
กำหนดค่า = โมฆะ;
-
โมฆะสาธารณะ doFilter (คำขอ ServletRequest, การตอบสนอง ServletResponse,
สายโซ่ FilterChain) พ่น IOException, ServletException {
request.setCharacterEncoding (การเข้ารหัส);
//chain.doFilter(ร้องขอ, ตอบกลับ);
chain.doFilter (คำขอ, ตอบกลับ);
-
โมฆะสาธารณะ init (การกำหนดค่า FilterConfig) พ่น ServletException {
this.config = กำหนดค่า;
สตริง s = config.getInitParameter("การเข้ารหัส");
ถ้า (s != null) {
การเข้ารหัส = s;
-
-
-
-
กำหนดค่า web.xml
<ตัวกรอง>
<filter-name>CharacterEncodingFilter</filter-name>
<ตัวกรองคลาส>com.SetCharacterEncodingFilter</ตัวกรองคลาส>
</ตัวกรอง>
<การแมปตัวกรอง>
<filter-name>CharacterEncodingFilter</filter-name>
<url-รูปแบบ>/*</url-รูปแบบ>
</การแมปตัวกรอง>
หากสถานการณ์นี้ยังคงเกิดขึ้นในกรณีของคุณ คุณสามารถลงไปดูว่าคุณมีสถานการณ์ที่สี่หรือไม่ หากเป็นเช่นนั้น ข้อมูลที่ส่งในแบบฟอร์มของคุณจะถูกส่งโดยใช้ get หรือไม่ ลองดูวิธีแก้ปัญหาที่สี่
นอกจากนี้ยังมีการประมวลผลข้อมูลที่มีตัวอักษรจีนด้วย รหัสการประมวลผลคือ:
packagedbJavaBean;
CodingConvert คลาสสาธารณะ
-
CodingConvert สาธารณะ ()
-
-
-
สตริงสาธารณะ toGb (สตริง uniStr) {
สตริง gbStr = "";
ถ้า(uniStr == null){
uniStr = "";
-
พยายาม{
ไบต์[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = สตริงใหม่ (tempByte, "GB2312");
-
catch (ข้อยกเว้นเช่น) {
-
กลับ gbStr;
-
สตริงสาธารณะ toUni (สตริง gbStr) {
สตริง uniStr = "";
ถ้า(gbStr == null){
gbStr = "";
-
พยายาม{
ไบต์ [] tempByte = gbStr.getBytes ("GB2312");
uniStr = สตริงใหม่ (tempByte, "ISO8859_1");
} catch (ข้อยกเว้นเช่น) {
-
กลับ uniStr;
-
-
คุณยังสามารถทำการแปลงโดยตรงได้ ขั้นแรก ให้เข้ารหัสสตริงที่ได้รับด้วย ISO-8859-1 จากนั้นจัดเก็บการเข้ารหัสในอาร์เรย์ไบต์ จากนั้นจึงแปลงอาร์เรย์เป็นวัตถุสตริง ตัวอย่างเช่น
สตริง str=request.getParameter("girl");
ไบต์ B[]=str.getBytes("ISO-8859-1");
Str=สตริงใหม่(B);
จากการแปลงข้างต้น ข้อมูลใด ๆ ที่ส่งมาสามารถแสดงได้อย่างถูกต้อง
(3) เมื่อคำขอ Formget ใช้ request.getParameter("name") บนเซิร์ฟเวอร์ อักขระที่อ่านไม่ออกจะถูกส่งกลับ การตั้งค่าตัวกรองตามวิธีของ Tomcat จะไม่ทำงาน หรือใช้ request.setCharacterEncoding("GBK"); ปัญหาก็คือในแง่ของวิธีการประมวลผลการถ่ายโอนพารามิเตอร์: หากคุณใช้เมธอด doGet(HttpServletRequest, HttpServletResponse) ในเซิร์ฟเล็ตเพื่อประมวลผลแม้ว่าจะเขียนไว้ก่อนหน้า:
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
ใช้งานไม่ได้เช่นกัน ชาวจีนที่กลับมายังอ่านไม่ออก! - - หากคุณเปลี่ยนฟังก์ชันนี้เป็น doPost(คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse) ทุกอย่างจะเรียบร้อย
ในทำนองเดียวกัน เมื่อใช้เพจ JSP สองเพจเพื่อประมวลผลอินพุตแบบฟอร์ม สาเหตุที่สามารถแสดงภาษาจีนได้ก็เนื่องมาจากใช้วิธีการโพสต์เพื่อส่งผ่าน และการเปลี่ยนเป็นวิธี get ยังคงใช้งานไม่ได้
จะเห็นได้ว่าคุณต้องให้ความสนใจเมื่อใช้เมธอด doGet() ในเซิร์ฟเล็ตหรือเมธอด get ใน JSP ท้ายที่สุดแล้ว สิ่งนี้เกี่ยวข้องกับการส่งข้อมูลพารามิเตอร์ผ่านเบราว์เซอร์ ซึ่งมีแนวโน้มที่จะทำให้เกิดความขัดแย้งหรือไม่ตรงกันในชุดอักขระที่ใช้กันทั่วไป
วิธีแก้ไขคือ:
1) เปิดไฟล์ server.xml ของ Tomcat ค้นหาบล็อก และเพิ่มบรรทัดต่อไปนี้:
URIEncoding=”GBK”
ที่สมบูรณ์ควรเป็นดังนี้:
<พอร์ตตัวเชื่อมต่อ = "8080" maxThreads = "150" minSpareThreads = "25" maxSpareThreads = "75" EnableLookups = "false" เปลี่ยนเส้นทางพอร์ต = "8443" AcceptCount = "100" debug = "0" ConnectionTimeout = "20000" DisableUploadTimeout = " true" URIEncoding="GBK"/>
2) รีสตาร์ท Tomcat ทุกอย่างเรียบร้อยดี
คุณสามารถดูสาเหตุว่าทำไมคุณจึงต้องเข้าร่วมโดยศึกษาไฟล์ใน $TOMCAT_HOME/webapps/tomcat-docs/config/http.html โปรดทราบว่าหากคุณใช้ UTF-8 ในตำแหน่งนี้ อักขระที่อ่านไม่ออกจะปรากฏใน Tomcat ในระหว่างกระบวนการส่งข้อมูล หากไม่ได้ผล ให้เปลี่ยนไปใช้ชุดอักขระอื่น
(4) มีตัวอักษรจีนบนหน้า JSP และตัวอักษรจีนบนปุ่ม แต่เมื่อดูหน้าผ่านเซิร์ฟเวอร์ ตัวอักษรที่อ่านไม่ออกจะปรากฏขึ้น:
วิธีแก้ไขคือ: ประการแรก ข้อความที่แปลแล้วไม่ควรรวมไว้ในไฟล์ JSP โดยตรง แต่ควรได้รับข้อความจาก Resource Bundle ผ่านแท็ก <bean:message> คุณควรใส่ข้อความภาษาจีนของคุณในไฟล์ Application.properties ไฟล์นี้อยู่ใต้ WEB-INF/classes/* ตัวอย่างเช่น หากฉันมีป้ายกำกับสองรายการสำหรับชื่อและอายุบนเพจ ฉันจะต้องสร้างแอปพลิเคชันก่อน คุณสมบัติ เนื้อหาภายในควรเป็น name="name" age="age" จากนั้นฉันวางไฟล์นี้ไว้ใต้ WEB-INF/classes/properties/ จากนั้นเข้ารหัสตามไฟล์ Application.properties เพื่อสร้างไฟล์ Chinese Resource สมมติว่าชื่อคือ Application_cn.properties คำสั่ง Native2ascii มีอยู่ใน JDK ซึ่งสามารถรับรู้การแปลงการเข้ารหัสอักขระได้ ค้นหาไดเร็กทอรีที่คุณวางไฟล์ Application.properties ไว้ในสภาพแวดล้อม DOS ดำเนินการคำสั่งในสภาพแวดล้อม DOS ไฟล์ทรัพยากรภาษาจีน Application_cn.properties ที่เข้ารหัสใน GBK จะถูกสร้างขึ้น: Native2ascii ?encoding gbk Application.properties Application_cn.properties คำสั่งข้างต้น ในอนาคต ไฟล์ Application_cn.properties ที่มีเนื้อหาต่อไปนี้จะถูกสร้างขึ้น: name=u59d3u540d age=u5e74u9f84 กำหนดค่าใน Struts-config.xml: <message-resources parameter="properties.Application_cn"/> ณ จุดนี้ โดยพื้นฐานแล้วมากกว่าครึ่งหนึ่งเสร็จสิ้นแล้ว จากนั้นคุณต้องเขียน <%@ page language="java" contentType="text/html;charset=GBK" %> บนเพจ JSP คือเขียน <bean:message key=”name”> เมื่อการเปลี่ยนแปลงนี้ปรากฏบนเพจ ชื่อภาษาจีนจะปรากฏขึ้น เช่นเดียวกับอายุ อักษรจีนบนปุ่มก็จะถูกประมวลผลในลักษณะเดียวกัน
(5) รหัสที่เขียนลงฐานข้อมูลอ่านไม่ออก:
วิธีแก้ไข: กำหนดค่าตัวกรองซึ่งเป็นตัวกรอง Servelet รหัสจะเหมือนกับครั้งที่สอง
หากคุณเชื่อมต่อโดยตรงกับฐานข้อมูลผ่าน JDBC โค้ดคอนฟิกูเรชันจะเป็นดังนี้: jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&CharacterEncoding=GBK ซึ่งจะช่วยให้แน่ใจว่าโค้ดในฐานข้อมูลจะไม่อ่านไม่ออก
หากคุณเชื่อมโยงผ่านแหล่งข้อมูล สิ่งที่กล่าวมาข้างต้นก็เหมาะสมเช่นกัน หากคุณกำหนดค่าอย่างถูกต้อง เมื่อคุณป้อนภาษาจีน มันจะอยู่ในฐานข้อมูลเป็นภาษาจีน สิ่งหนึ่งที่ควรทราบก็คือ คุณต้องใช้หน้า <%@ บน เพจที่แสดงข้อมูล language="java" contentType="text/html;charset=GBK" %>บรรทัดโค้ดนี้ ควรสังเกตว่าพนักงานต้อนรับบางคนใช้ Dreamver ในการเขียนโค้ด พวกเขาเปลี่ยนเป็น jsp มีสิ่งหนึ่งที่ต้องใส่ใจและนั่นคือการส่ง Action ใน Dreamver และคุณต้องส่งไป เนื่องจากการส่ง JSP มีสองวิธี: POST และ GET แต่โค้ดที่ส่งโดยทั้งสองวิธีนี้ยังคงแตกต่างกันมากในแง่ของการเข้ารหัส ซึ่งจะอธิบายในภายหลัง
สรุปบทความ:
ที่นี่เราพูดถึงวิธีแก้ปัญหา jsp ที่อ่านไม่ออกเป็นหลัก
1. ปัญหาพื้นฐานที่สุดของอักขระที่อ่านไม่ออก
PHPCE.CN คู่มือการออกแบบ
3. วิธีจัดการกับอักขระที่อ่านไม่ออกในรูปแบบรับวิธีการส่ง
หากคุณใช้วิธี get เพื่อส่งภาษาจีน หน้าที่ยอมรับพารามิเตอร์ก็จะปรากฏเป็นรหัสที่อ่านไม่ออกเช่นกัน สาเหตุของรหัสที่อ่านไม่ออกนี้เกิดจากรูปแบบการเข้ารหัสภายในของ Tomcat iso8859-1 Tomcat จะเข้ารหัสอักขระภาษาจีนโดยใช้วิธีการเข้ารหัสเริ่มต้นคือ get, iso8859-1 และต่อท้าย URL หลังจากการเข้ารหัส ส่งผลให้พารามิเตอร์อ่านไม่ออก / และได้รับจากเพจ
สารละลาย:
A. ใช้วิธีแรกในตัวอย่างด้านบนเพื่อถอดรหัสอักขระที่ได้รับแล้วแปลงรหัส
B. Get ใช้การส่ง url และมีการเข้ารหัส iso8859-1 ก่อนป้อน url หากต้องการส่งผลต่อการเข้ารหัสนี้ คุณจะต้องเพิ่ม useBodyEncodingForURI="true" ให้กับโหนด Connector ใน server.xml
การกำหนดค่าแอตทริบิวต์สามารถควบคุมวิธีการเข้ารหัสอักขระภาษาจีนของ Tomcat สำหรับวิธีการรับ คุณลักษณะด้านบนจะควบคุมการส่งการรับที่จะเข้ารหัสโดยใช้รูปแบบการเข้ารหัสที่กำหนดโดย request.setCharacterEncoding("UTF-8") ดังนั้นจึงเข้ารหัสเป็น utf-8 โดยอัตโนมัติ และหน้ายอมรับก็ยอมรับได้ตามปกติ แต่ฉันคิดว่ากระบวนการเข้ารหัสที่แท้จริงคือ Tomcat ต้องเปลี่ยน D:Tomcatconfserver.xml และระบุรูปแบบการเข้ารหัสของเบราว์เซอร์เป็น "จีนตัวย่อ":
<พอร์ตตัวเชื่อมต่อ = "8080"
maxThreads = "150" minSpareThreads = "25" maxSpareThreads = "75"
EnableLookups = "เท็จ" เปลี่ยนเส้นทาง = "8443" ยอมรับCount = "100"
debug = "0" การเชื่อมต่อหมดเวลา = "20000" useBodyEncodingForURI = "true"
DisableUploadTimeout="true" URIEncoding="UTF-8"/> PHPCE.CN, URIEncoding="UTF-8" ที่ตั้งค่าไว้ในคู่มือการออกแบบจะถูกเข้ารหัสอีกครั้ง แต่เนื่องจากมันถูกเข้ารหัสเป็น utf-8 จึงจะไม่เป็นเช่นนั้น เข้ารหัสอีกครั้ง มีบางอย่างเปลี่ยนไป หากได้รับการเข้ารหัสจาก URL หน้าการรับจะถูกถอดรหัสตาม URIEncoding="UTF-8"
คุณสามารถทราบสาเหตุว่าทำไมคุณจึงต้องเพิ่มมันโดยศึกษาไฟล์ใน $TOMCAT_HOME/webapps/tomcat-docs/config/http.html คุณสามารถตรวจสอบว่าการเปลี่ยนแปลงของคุณสำเร็จหรือไม่: ก่อนที่จะทำการเปลี่ยนแปลง จะเป็นหน้าที่อ่านไม่ออก จะปรากฏบนหน้าของคุณ ในเบราว์เซอร์ IE คลิกเมนู "ดู | การเข้ารหัส" แล้วคุณจะพบว่าเลือก "ยุโรปตะวันตก (ISO)" หลังจากการเปลี่ยนแปลง คลิกเมนู "ดู | การเข้ารหัส" แล้วคุณจะพบว่าได้เลือก "ภาษาจีนตัวย่อ (GB2312)" ไว้
4. แก้ไขอักขระที่อ่านไม่ออกเมื่ออัปโหลดไฟล์ เมื่ออัปโหลดไฟล์ การตั้งค่าแบบฟอร์มจะเป็น enctype="multipart/form-data" วิธีนี้ไฟล์จะถูกส่งในลักษณะสตรีมมิ่ง หากคุณใช้ส่วนประกอบการอัพโหลดของ apach คุณจะพบโค้ดที่อ่านไม่ออกจำนวนมาก นี่เป็นเพราะว่า apach's Early Commons-fileupload.jar มีข้อบกพร่อง และอักขระภาษาจีนถูกนำออกมาและถอดรหัส เนื่องจากวิธีนี้ถูกส่งไปแล้ว การเข้ารหัสจะใช้รูปแบบการเข้ารหัสเริ่มต้นของ Tomcat iso-8859-1 โดยอัตโนมัติ แต่ปัญหาของอักขระที่อ่านไม่ออกคือ สัญลักษณ์พิเศษ เช่น จุด เครื่องหมายจุลภาค เป็นต้น กลายเป็นอักขระที่อ่านไม่ออก หากจำนวนอักขระจีนเป็นเลขคี่ อักขระที่อ่านไม่ออกจะปรากฏขึ้น หากมีเลขคู่ การแยกวิเคราะห์จะเป็นปกติ .
วิธีแก้ไข: ดาวน์โหลด commons-fileupload-1.1.1.jar เวอร์ชันของ jar ได้แก้ไขข้อบกพร่องเหล่านี้แล้ว
อย่างไรก็ตาม เมื่อแตกเนื้อหา คุณยังต้องแปลงอักขระที่แตกออกมาจาก iso8859-1 เป็น utf-8 สามารถรับตัวอักษรจีนและตัวอักษรปกติทั้งหมดได้
5. รหัส Java เกี่ยวกับการร้องขอ url รับพารามิเตอร์ที่อ่านไม่ออก
รูปแบบการเข้ารหัสของ url ขึ้นอยู่กับ URIEncoding="UTF-8" ที่กล่าวถึงข้างต้น หากตั้งค่ารูปแบบการเข้ารหัสนี้ หมายความว่าพารามิเตอร์อักขระภาษาจีนทั้งหมดไปยัง URL จะต้องได้รับการเข้ารหัส มิฉะนั้น ค่าพารามิเตอร์อักขระภาษาจีนที่ได้รับจะอ่านไม่ออกทั้งหมด เช่น ลิงก์ Response.sendDerect ("/a.jsp?name=Zhang Dawei"); และจะใช้โดยตรงใน a.jsp
PHPCE.CN คู่มือการออกแบบ
String name = request.getParameter("name"); สิ่งที่คุณได้รับคืออักขระที่อ่านไม่ออก เนื่องจากมีการกำหนดไว้ว่าต้องเป็น utf-8 ดังนั้นการเปลี่ยนเส้นทางจึงควรเขียนดังนี้:
Response.sendDerect("/a.jsp?name=URLEncode.encode("Zhang Dawei","utf-8"); เท่านั้น
จะเกิดอะไรขึ้นหากไม่ได้ตั้งค่าพารามิเตอร์นี้ URIEncoding="UTF-8" หากไม่ได้ตั้งค่า ระบบจะใช้รูปแบบการเข้ารหัสเริ่มต้น iso8859-1 ปัญหาเกิดขึ้นอีกประการแรกคือหากจำนวนค่าพารามิเตอร์เป็นเลขคี่ก็สามารถแยกวิเคราะห์ได้ตามปกติ นอกจากนี้ หากอักขระตัวสุดท้ายเป็นภาษาอังกฤษ ก็สามารถแยกวิเคราะห์ได้ตามปกติ แต่เครื่องหมายวรรคตอนภาษาจีนยังคงอ่านไม่ออก เพื่อความสะดวก หากไม่มีเครื่องหมายวรรคตอนภาษาจีนในพารามิเตอร์ของคุณ คุณสามารถเพิ่มสัญลักษณ์ภาษาอังกฤษที่ส่วนท้ายของค่าพารามิเตอร์เพื่อแก้ไขปัญหาที่อ่านไม่ออก จากนั้นจึงลบสัญลักษณ์สุดท้ายออกหลังจากได้รับพารามิเตอร์แล้ว สามารถขูดหรือนำไปใช้ได้
6. เกี่ยวกับคำขอ URL โค้ดสคริปต์จะควบคุมการเปลี่ยนเส้นทางเพจด้วย หากพารามิเตอร์ที่ได้รับอ่านไม่ออก นอกจากนี้ยังจะเกี่ยวข้องกับพารามิเตอร์ที่แนบมาด้วยและแยกวิเคราะห์พารามิเตอร์บนเพจที่ได้รับ หากพารามิเตอร์อักขระภาษาจีนนี้ไม่ได้ดำเนินการประมวลผลการเข้ารหัสที่ระบุโดย URIEncoding="UTF-8" อักขระภาษาจีนที่ได้รับจากหน้ารับก็จะอ่านไม่ออกเช่นกัน การประมวลผลและการเข้ารหัสสคริปต์เป็นเรื่องยาก คุณต้องมีไฟล์ที่สอดคล้องกับสคริปต์การเข้ารหัส จากนั้นจึงเรียกวิธีการในสคริปต์เพื่อเข้ารหัสอักขระภาษาจีน
7. เกี่ยวกับปัญหาที่อ่านไม่ออกของ jsp ที่เปิดใน MyEclipse สำหรับโปรเจ็กต์ที่มีอยู่ รูปแบบการจัดเก็บข้อมูลของไฟล์ Jsp อาจเป็น utf-8 หากติดตั้ง eclipse ใหม่ รูปแบบการเข้ารหัสที่ใช้โดยดีฟอลต์ในการเปิดคือ iso8859-1 ดังนั้นตัวอักษรจีนใน jsp จึงอ่านไม่ออก โค้ดที่อ่านไม่ออกนี้ค่อนข้างแก้ได้ง่าย เพียงไปที่การตั้งค่าของ eclipse3.1 และค้นหาทั่วไป -> ตัวแก้ไข และตั้งค่าการเข้ารหัสการเปิดไฟล์ของคุณเป็น utf-8 Eclipse จะเปิดขึ้นอีกครั้งโดยอัตโนมัติด้วยรูปแบบการเข้ารหัสใหม่ ตัวอักษรจีนสามารถแสดงได้ตามปกติ
8. เกี่ยวกับโค้ดที่อ่านไม่ออกเมื่อเปิดหน้า HTML ใน eclipse เนื่องจากเพจส่วนใหญ่สร้างโดย Dreamweaver รูปแบบการจัดเก็บข้อมูลจึงแตกต่างจากการจดจำ eclipse
โดยทั่วไป ในกรณีนี้ ให้สร้าง jsp ใหม่ใน eclipse คัดลอกเนื้อหาเพจโดยตรงจาก dreamweaver และวางลงใน jsp
PHPCE.CN คู่มือการออกแบบ
ปัญหารหัสที่อ่านไม่ออกนี้เป็นปัญหารหัสที่อ่านไม่ออกที่ง่ายที่สุด โดยปกติแล้วสิ่งใหม่จะปรากฏขึ้น เป็นรหัสที่อ่านไม่ออกซึ่งเกิดจากการเข้ารหัสหน้าไม่สอดคล้องกัน
<%@ ภาษาเพจ = "java" pageEncoding = "UTF-8"%>
<%@ หน้า contentType="text/html;charset=iso8859-1"%>
<html>
<หัว>
<title>ปัญหาภาษาจีน</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</หัว>
</หัว>
<ร่างกาย>
ฉันเป็นคนดี
</ร่างกาย>
</html>
การเข้ารหัสในสามแห่ง
รูปแบบการเข้ารหัสในตอนแรกคือรูปแบบการจัดเก็บของไฟล์ jsp Ecljpse จะบันทึกไฟล์ตามรูปแบบการเข้ารหัสนี้ และคอมไพล์ไฟล์ jsp รวมถึงตัวอักษรจีนข้างใน
การเข้ารหัสที่สองคือรูปแบบการถอดรหัส เนื่องจากไฟล์ที่บันทึกเป็น UTF-8 จะถูกถอดรหัสเป็น iso8859-1 หากมีภาษาจีนก็จะอ่านไม่ออกแน่นอน นั่นหมายความว่ามันจะต้องสอดคล้องกัน เส้นที่ตั้งของสถานที่ที่สองนั้นไม่จำเป็นต้องอยู่ตรงนั้น รูปแบบการเข้ารหัสเริ่มต้นคือ ISO8859-1 เช่นกัน ดังนั้นหากไม่มีบรรทัดนี้ “ฉันเป็นคนดี” ก็คงอ่านไม่ออกเช่นกัน มันจะต้องสอดคล้องกัน
การเข้ารหัสที่สามคือการควบคุมวิธีการถอดรหัสของเบราว์เซอร์ หากการถอดรหัสก่อนหน้านี้สอดคล้องและถูกต้อง รูปแบบการเข้ารหัสก็ไม่สำคัญ หน้าเว็บบางหน้าอาจอ่านไม่ออกเนื่องจากเบราว์เซอร์ไม่สามารถระบุได้ว่าจะใช้รูปแบบการเข้ารหัสใด เนื่องจากบางครั้งเพจถูกฝังอยู่ในเพจ เบราว์เซอร์จึงสร้างความสับสนให้กับรูปแบบการเข้ารหัส ตัวอักษรที่อ่านไม่ออกปรากฏขึ้น PHPCE.CN คู่มือการออกแบบ
2. ปัญหาอักขระที่อ่านไม่ออกที่ได้รับหลังจากส่งแบบฟอร์มโดยใช้วิธี Post ก็เป็นปัญหาที่พบบ่อยเช่นกัน รหัสที่อ่านไม่ออกนี้ยังเกิดจากรูปแบบการเข้ารหัสภายในของ Tomcat คือ iso8859-1 กล่าวคือ เมื่อมีการส่งโพสต์ หากไม่ได้ตั้งค่ารูปแบบการเข้ารหัสที่ส่งมา ก็จะถูกส่งในวิธี iso8859-1 แต่เป็น jsp ที่ยอมรับ จะได้รับการยอมรับในวิธี utf-8 ส่งผลให้ตัวอักษรอ่านไม่ออก ด้วยเหตุนี้ จึงมีวิธีแก้ปัญหาและการเปรียบเทียบหลายประการดังนี้
A. การเข้ารหัสการแปลงเมื่อยอมรับพารามิเตอร์
String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8"); ในกรณีนี้ แต่ละพารามิเตอร์จะต้องแปลงรหัสในลักษณะนี้ ลำบากใจมาก. แต่คุณสามารถรับตัวอักษรจีนได้แน่นอน
B. ที่จุดเริ่มต้นของหน้าคำขอ ให้รันโค้ดเข้ารหัสที่ร้องขอ request.setCharacterEncoding("UTF-8") และตั้งค่าชุดอักขระของเนื้อหาที่ส่งเป็น UTF-8 ในกรณีนี้ หน้าเว็บที่ยอมรับพารามิเตอร์นี้ไม่จำเป็นต้องแปลงรหัส ใช้โดยตรง
String str = request.getParameter("something"); คุณสามารถรับพารามิเตอร์ตัวอักษรจีนได้ แต่ประโยคนี้จำเป็นต้องดำเนินการในทุกหน้า วิธีการนี้ใช้ได้กับการส่งโพสต์เท่านั้น แต่จะใช้ไม่ได้กับ enctype="multipart/form-data" เมื่อส่งไฟล์และอัพโหลดไฟล์ อักขระที่อ่านไม่ออกทั้งสองตัวจะมีการอธิบายแยกกันในภายหลัง
C. เพื่อหลีกเลี่ยงการเขียน request.setCharacterEncoding("UTF-8") ในทุกหน้า ขอแนะนำให้ใช้ตัวกรองเพื่อ
ดำเนินการประมวลผลการเข้ารหัส มีตัวอย่างมากมายทางออนไลน์ โปรดตรวจสอบด้วยตัวเอง