บทความต่อไปนี้จะอธิบายและหารือเกี่ยวกับประเด็นข้างต้น เราจะใช้คำว่า "ภาษาจีน" เป็นตัวอย่าง การค้นหาข้อมูลที่เกี่ยวข้องแสดงว่าการเข้ารหัส GB2312 ของ "ภาษาจีน" คือ "d6d0 cec4" และการเข้ารหัส Unicode คือ "4e2d 6587" การเข้ารหัส UTF คือ "e4b8ad e69687" (โปรดทราบว่าคำว่า "ภาษาจีน" สองคำไม่มีการเข้ารหัส iso8859-1 แต่สามารถ "แสดง" ด้วยการเข้ารหัส iso8859-1 ได้)
1. ความรู้พื้นฐานเกี่ยวกับการเขียนโค้ด:
การเข้ารหัสที่เก่าแก่ที่สุดคือ iso8859-1 ซึ่งคล้ายกับการเข้ารหัส ASCII อย่างไรก็ตาม เพื่ออำนวยความสะดวกในการแสดงภาษาต่างๆ การเข้ารหัสมาตรฐานจำนวนมากจึงค่อยๆ เกิดขึ้น การเข้ารหัสที่สำคัญมีดังนี้:
1. iso8859-1
เป็นการเข้ารหัสแบบไบต์เดียว และช่วงอักขระสูงสุดที่สามารถแสดงได้คือ 0-255 ซึ่งใช้กับซีรี่ส์ภาษาอังกฤษ ตัวอย่างเช่น การเข้ารหัสตัวอักษร a คือ 0x61=97
แน่นอนว่าช่วงอักขระที่แสดงโดยการเข้ารหัส iso8859-1 นั้นแคบมากและไม่สามารถแสดงอักขระภาษาจีนได้ อย่างไรก็ตาม เนื่องจากเป็นการเข้ารหัสแบบไบต์เดียวและสอดคล้องกับหน่วยการแสดงพื้นฐานที่สุดของคอมพิวเตอร์ การเข้ารหัส iso8859-1 จึงยังคงใช้อยู่ในหลายกรณี และในหลายโปรโตคอล การเข้ารหัสนี้จะถูกใช้เป็นค่าเริ่มต้น ตัวอย่างเช่น แม้ว่าจะไม่มีคำว่า "ภาษาจีน" ในการเข้ารหัส iso8859-1 แต่ให้ใช้การเข้ารหัส gb2312 เป็นตัวอย่าง แต่ควรเป็นอักขระสองตัวของ "d6d0 cec4" เมื่อใช้การเข้ารหัส iso8859-1 จะถูกแบ่งออกเป็น 4 ไบต์ . แสดงถึง: "d6 d0 ce c4" (อันที่จริงเมื่อจัดเก็บก็จะถูกประมวลผลเป็นไบต์ด้วย) และหากเป็นการเข้ารหัส UTF จะเป็น 6 ไบต์ "e4 b8 ad e6 96 87" แน่นอนว่าการแสดงนี้จะต้องอิงจากการเข้ารหัสอื่น
2.GB2312/GBK
นี่คือรหัสมาตรฐานแห่งชาติของ Hanzi ซึ่งใช้เพื่อแสดงอักขระจีนเป็นพิเศษ โดยเป็นการเข้ารหัสแบบไบต์คู่ และตัวอักษรภาษาอังกฤษสอดคล้องกับ iso8859-1 (เข้ากันได้กับการเข้ารหัส iso8859-1) การเข้ารหัส gbk สามารถใช้แทนอักขระภาษาจีนตัวเต็มและตัวย่อได้ในเวลาเดียวกัน ในขณะที่ gb2312 ใช้ได้เฉพาะอักขระตัวย่อเท่านั้นที่เข้ากันได้กับการเข้ารหัส gb2312
3.ยูนิโค้ด
นี่คือการเข้ารหัสแบบครบวงจรที่สุดที่สามารถใช้เพื่อแทนอักขระในทุกภาษา และเป็นการเข้ารหัสแบบไบต์คู่ที่มีความยาวคงที่ (เช่น สี่ไบต์) รวมถึงตัวอักษรภาษาอังกฤษด้วย ดังนั้นจึงอาจกล่าวได้ว่าไม่รองรับการเข้ารหัส iso8859-1 และไม่สามารถใช้งานร่วมกับการเข้ารหัสใดๆ ได้ อย่างไรก็ตาม เมื่อเปรียบเทียบกับการเข้ารหัส iso8859-1 การเข้ารหัส Uniocode จะเพิ่ม 0 ไบต์ข้างหน้าเท่านั้น เช่น ตัวอักษร a คือ "00 61"
ควรสังเกตว่าการเข้ารหัสที่มีความยาวคงที่นั้นง่ายสำหรับคอมพิวเตอร์ในการประมวลผล (โปรดทราบว่า GB2312/GBK ไม่ใช่การเข้ารหัสที่มีความยาวคงที่) และสามารถใช้ยูนิโค้ดเพื่อแสดงอักขระทั้งหมดได้ ดังนั้นการเข้ารหัสยูนิโค้ดจึงถูกใช้เป็นการภายในในซอฟต์แวร์จำนวนมาก เช่น จาวา
4.UTF
เมื่อพิจารณาว่าการเข้ารหัส Unicode เข้ากันไม่ได้กับการเข้ารหัส ISO8859-1 และใช้พื้นที่มากขึ้นอย่างง่ายดาย เนื่องจากสำหรับตัวอักษรภาษาอังกฤษ Unicode ต้องใช้ไบต์สองไบต์ในการแสดงด้วย ดังนั้นยูนิโค้ดจึงไม่สะดวกในการส่งและจัดเก็บ ดังนั้นจึงมีการเข้ารหัส UTF ขึ้น การเข้ารหัส UTF เข้ากันได้กับการเข้ารหัส ISO8859-1 และยังสามารถใช้เพื่อแสดงอักขระในทุกภาษา อย่างไรก็ตาม การเข้ารหัส UTF นั้นเป็นการเข้ารหัสที่มีความยาวผันแปรได้ และความยาวของอักขระแต่ละตัวมีตั้งแต่ 1-6 ไบต์ นอกจากนี้ การเข้ารหัส UTF ยังมาพร้อมกับฟังก์ชันการตรวจสอบแบบง่ายๆ โดยทั่วไปแล้ว ตัวอักษรภาษาอังกฤษจะแสดงเป็นหนึ่งไบต์ ในขณะที่ตัวอักษรจีนจะใช้สามไบต์
โปรดทราบว่าถึงแม้จะใช้ UTF เพื่อใช้พื้นที่น้อยกว่า แต่ก็เทียบได้กับการเข้ารหัส Unicode เท่านั้น หากคุณรู้อยู่แล้วว่าเป็นอักขระภาษาจีน การใช้ GB2312/GBK เป็นวิธีที่ประหยัดที่สุดอย่างไม่ต้องสงสัย แต่ในทางกลับกัน เป็นที่น่าสังเกตว่าแม้ว่าการเข้ารหัส UTF จะใช้ 3 ไบต์สำหรับอักขระภาษาจีน แม้แต่สำหรับหน้าเว็บที่มีอักขระจีน การเข้ารหัส UTF จะบันทึกมากกว่าการเข้ารหัส Unicode เนื่องจากหน้าเว็บมีอักขระภาษาอังกฤษจำนวนมาก
2. การประมวลผลอักขระของ Java
เมื่อเขียนแอปพลิเคชัน Java จะมีหลายตำแหน่งที่เกี่ยวข้องกับการเข้ารหัสชุดอักขระ บางตำแหน่งต้องการการตั้งค่าที่ถูกต้อง และบางตำแหน่งต้องการการประมวลผลในระดับหนึ่ง
1.getBytes(ชุดอักขระ)
นี่เป็นฟังก์ชันมาตรฐานสำหรับการประมวลผลสตริง Java ฟังก์ชันคือการเข้ารหัสอักขระที่แสดงโดยสตริงตามชุดอักขระและแสดงเป็นไบต์ โปรดทราบว่าสตริงจะถูกจัดเก็บไว้ในหน่วยความจำ Java เสมอในการเข้ารหัส Unicode ตัวอย่างเช่น "ภาษาจีน" จะถูกจัดเก็บเป็น "4e2d 6587" ภายใต้สถานการณ์ปกติ (นั่นคือ เมื่อไม่มีข้อผิดพลาด) หากชุดอักขระเป็น "gbk" จะถูกเข้ารหัสเป็น "d6d0 cec4" จากนั้นไบต์ "d6 d0 ce c4" จะถูกส่งกลับ หากชุดอักขระคือ "utf8" จุดสิ้นสุดคือ "e4 b8 ad e6 96 87" หากเป็น "iso8859-1" เนื่องจากไม่สามารถเข้ารหัสได้ ในที่สุด "3f 3f" ก็จะถูกส่งกลับ (หมายเหตุ: "3f 3f" คือเครื่องหมายคำถามสองตัว)
2. สตริงใหม่ (ชุดอักขระ)
นี่เป็นอีกหนึ่งฟังก์ชันมาตรฐานสำหรับการประมวลผลสตริง Java ซึ่งตรงกันข้ามกับฟังก์ชันก่อนหน้า โดยจะรวมและระบุอาร์เรย์ไบต์ตามการเข้ารหัสชุดอักขระ และสุดท้ายจะแปลงเป็น Unicode เพื่อจัดเก็บข้อมูล จากตัวอย่าง getBytes ข้างต้น ทั้ง "gbk" และ "utf8" สามารถสร้างผลลัพธ์ที่ถูกต้อง "4e2d 6587" แต่ในที่สุด iso8859-1 ก็กลายเป็น "003f 003f" (เครื่องหมายคำถามสองเครื่องหมาย)
เนื่องจาก utf8 สามารถใช้เพื่อแสดง/เข้ารหัสอักขระทั้งหมดได้ new String( str.getBytes( "utf8" ), "utf8" ) === str ซึ่งสามารถย้อนกลับได้อย่างสมบูรณ์
3. setCharacterEncoding()
ฟังก์ชันนี้ใช้เพื่อตั้งค่าคำขอ http หรือการเข้ารหัสที่เกี่ยวข้อง
สำหรับการร้องขอ จะอ้างถึงการเข้ารหัสของเนื้อหาที่ส่ง หลังจากระบุ คุณสามารถรับสตริงที่ถูกต้องได้โดยตรงผ่าน getParameter() หากไม่ได้ระบุ การเข้ารหัส iso8859-1 จะถูกใช้เป็นค่าเริ่มต้น ซึ่งต้องมีการประมวลผลเพิ่มเติม ดู "การป้อนแบบฟอร์ม" ด้านล่าง เป็นที่น่าสังเกตว่าไม่สามารถดำเนินการ getParameter() ได้ก่อนที่จะดำเนินการ setCharacterEncoding() สถานะเอกสาร Java: ต้องเรียกเมธอดนี้ก่อนที่จะอ่านพารามิเตอร์คำขอหรืออ่านอินพุตโดยใช้ getReader()