JSP จะต้อง "เข้ารหัส" สองครั้ง ขั้นแรกจะใช้การเข้ารหัสหน้า ขั้นที่สองจะใช้ utf-8 ถึง utf-8 และขั้นที่สามคือหน้าเว็บที่สร้างโดย Tomcat โดยใช้ contentType
เกี่ยวกับความแตกต่างระหว่างแอตทริบิวต์ pageEncoding และ contentType ในหน้า JSP:
pageEncoding คือการเข้ารหัสของไฟล์ jsp เอง
ชุดอักขระของ contentType อ้างถึงการเข้ารหัสเนื้อหาเมื่อเซิร์ฟเวอร์ส่งไปยังไคลเอนต์
JSP จะต้อง "เข้ารหัส" สองครั้ง ขั้นแรกจะใช้การเข้ารหัสหน้า ขั้นที่สองจะใช้ utf-8 ถึง utf-8 และขั้นที่สามคือหน้าเว็บที่สร้างโดย Tomcat โดยใช้ contentType
ขั้นตอนแรกคือการคอมไพล์ jsp เป็น .java มันจะอ่าน jsp ตามการตั้งค่าของ pageEncoding ผลลัพธ์ก็คือรูปแบบการเข้ารหัสที่ระบุจะถูกแปลเป็นซอร์สโค้ด UTF-8 JAVA แบบรวม (เช่น .java) การตั้งค่าไม่ถูกต้อง หรือไม่มีการตั้งค่า และสิ่งที่ออกมาคือตัวอักษรจีนที่อ่านไม่ออก
ขั้นตอนที่สองคือการคอมไพล์จากซอร์สโค้ด JAVAC ของ JAVAC ไปจนถึง java byteCode ไม่ว่าจะใช้รูปแบบการเข้ารหัสใดในการเขียน JSP ผลลัพธ์ของขั้นตอนนี้ก็คือซอร์สโค้ด Java ที่เข้ารหัส UTF-8 ทั้งหมด
JAVAC ใช้การเข้ารหัส UTF-8 เพื่ออ่านซอร์สโค้ด Java และคอมไพล์เป็นรหัสไบนารี่การเข้ารหัส UTF-8 (เช่น .class) นี่คือข้อกำหนดของ JVM สำหรับการแสดงออกของสตริงคงที่ในรหัสไบนารี่ (การเข้ารหัส Java)
ขั้นตอนที่สามคือ Tomcat (หรือคอนเทนเนอร์แอปพลิเคชัน) โหลดและดำเนินการโค้ดไบนารี่ JAVA จากขั้นตอนที่สอง ผลลัพธ์คือสิ่งที่เห็นบนไคลเอนต์ ในขณะนี้ พารามิเตอร์ contentType ที่ซ่อนอยู่ในขั้นตอนที่หนึ่งและสองจะทำงาน
การตั้งค่าประเภทเนื้อหา
ค่าเริ่มต้นสำหรับ pageEncoding และ contentType คือทั้ง ISO8859-1 หากคุณตั้งค่าอย่างใดอย่างหนึ่งโดยไม่ตั้งใจ อีกค่าหนึ่งจะเหมือนกัน (นี่เป็นกรณีของ TOMCAT4.1.27) แต่นี่ไม่แน่นอน ขึ้นอยู่กับวิธีการประมวลผลของ JSPC แต่ละอันจะไม่เท่ากับ contentType ซึ่งเอื้อต่อการพัฒนาและการแสดงหน้าเว็บ JSP ข้อความ CJKV ในเอเชียมากกว่า (เช่น pageEncoding=GB2312 ไม่เท่ากับ contentType=utf-8)
ไฟล์ jsp ไม่เหมือนกับ .java เมื่อคอมไพเลอร์อ่าน .java จะมีค่าเริ่มต้นเป็นการเข้ารหัสที่สอดคล้องกับโลแคลที่ระบบปฏิบัติการกำหนด โดยทั่วไปไม่ว่าเราจะเขียนโค้ดใน Notepad หรือใน ue หากไม่มีการแปลงโค้ดแบบพิเศษ สิ่งที่เขียนจะเป็นเนื้อหาในรูปแบบการเข้ารหัสในตัวเครื่อง ดังนั้นวิธีการที่คอมไพเลอร์นำมาใช้สามารถอนุญาตให้เครื่องเสมือนรับข้อมูลที่ถูกต้องได้
แต่นี่ไม่ใช่กรณีของไฟล์ jsp ไม่มีกระบวนการแปลงรหัสเริ่มต้น แต่สามารถแปลงรหัสที่ถูกต้องได้โดยการระบุ pageEncoding
ตัวอย่างเช่น:
<%@ หน้า contentType="text/html;charset=utf-8" %>
ส่วนใหญ่พิมพ์ตัวอักษรที่อ่านไม่ออก เนื่องจากข้อความ "How are you" ที่ฉันป้อนมาจาก gbk แต่ไม่ทราบว่าเซิร์ฟเวอร์บันทึก "How are you" ได้อย่างถูกต้องหรือไม่
เพียงเปลี่ยนเป็นเนื้อหาต่อไปนี้
<%@ หน้า contentType="text/html;charset=utf-8" pageEncoding="GBK"%>