1. คำนำ
เมื่อวิเคราะห์เปรียบเทียบและเปรียบเทียบวิธีการเปรียบเทียบของคลาสสตริงจะถูกวิเคราะห์ สตริงพื้นฐานใช้อาร์เรย์ถ่าน [] เพื่อจัดเก็บองค์ประกอบ เมื่อเปรียบเทียบอักขระของสองสตริงจะถูกเปรียบเทียบและตัวละครจะถูกเก็บไว้ด้วยถ่าน ในเวลานี้ฉันก็คิดว่าสามารถใช้ถ่านในร้านชวาจีนได้หรือไม่? หลังจากนั้นฉันก็พบว่ามันโอเคและสิ่งนี้ยังนำไปสู่รูปแบบการเข้ารหัสของตัวละครใน Java
2. รูปแบบการจัดเก็บ Java
ใน Java รหัสต่อไปนี้ได้รับรูปแบบการเข้ารหัสที่หลากหลายของตัวละคร 'จาง'
นำเข้า java.io.unsupportenCodingException; การทดสอบคลาสสาธารณะ {สตริงคงที่สาธารณะ getCode (เนื้อหาสตริง, รูปแบบสตริง) พ่น unsupportencodexception {byte [] bytes = content.getBytes (รูปแบบ); StringBuffer sb = new StringBuffer (); สำหรับ (int i = 0; i <bytes.length; i ++) {sb.append (integer.tohexstring (bytes [i] & 0xff) .touppercase ()+""); } return sb.toString (); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น unsupportencodexception {system.out.println ("gbk:" + getCode ("จาง", "gbk")); System.out.println ("GB2312:" + getCode ("จาง", "GB2312")); System.out.println ("ISO-8859-1:" + getCode ("จาง", "ISO-8859-1")); System.out.println ("Unicode:" + GetCode ("Zhang", "Unicode")); System.out.println ("UTF-16:" + getCode ("จาง", "UTF-16")); System.out.println ("UTF-8:" + getCode ("จาง", "UTF-8")); -ผลการทำงาน:
GBK: D5 C5 GB2312: D5 C5 ISO-8859-1: 3F Unicode: Fe FF 5F 20 UTF-16: FE FF 5F 20 UTF-8: E5 BC A0
หมายเหตุ: จากผลลัพธ์เราสามารถรู้ได้ว่า GBK ของตัวละคร 'จาง' นั้นเหมือนกับการเข้ารหัส GB2312 และ Unicode นั้นเหมือนกับการเข้ารหัส UTF-16 แต่การเข้ารหัส UTF-16 แต่การเข้ารหัส UTF-8 นั้นแตกต่างกันทั้งหมด ดังนั้นใน JVM รูปแบบการเข้ารหัสตัวละคร 'Zhang' จัดเก็บอะไรไว้? มาเริ่มการวิเคราะห์ของเราด้านล่าง
3. สำรวจแนวคิดลับ
1. ดูรูปแบบการจัดเก็บของพูลค่าคงที่ไฟล์. class
รหัสทดสอบมีดังนี้
การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string str = "จาง"; -ใช้การทดสอบ javap -verbose. class สำหรับการสลายตัวและสถานการณ์การรวมกันอย่างต่อเนื่องมีดังนี้:
จากนั้นใช้ WinHex เพื่อเปิดไฟล์คลาสและพบว่าตัวละคร 'Zhang' ถูกเก็บไว้ในพูลคงที่ดังนี้
หมายเหตุ: สองข้างต้นสามารถเก็บไว้ในไฟล์คลาสในรูปแบบ UTF-8
แต่มันอยู่ในรูปแบบ UTF-8 ที่รันไทม์หรือไม่? เดินทางต่อการสำรวจของเราต่อไป
2. ค้นหาในโปรแกรม
ใช้รหัสต่อไปนี้
การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string str = "จาง"; System.out.println (Integer.toHexstring (Str.CodePointat (0)). touppercase ()); -ผลการทำงาน:
5F20
หมายเหตุ: จากผลลัพธ์เรารู้ว่าเมื่อเวลาผ่านไป JVM ใช้รูปแบบ UTF-16 สำหรับการจัดเก็บข้อมูล UTF-16 โดยทั่วไปจะถูกเก็บไว้ด้วย 2 ไบต์ หากพบสองไบต์จะถูกแสดงโดย 4 ไบต์ จะมีบทความอื่นที่จะแนะนำในภายหลัง เมื่อเราตรวจสอบซอร์สโค้ดของคลาสอักขระเราจะพบว่ามันเป็นรหัสที่ใช้ UTF-16 และเราพบคำตอบที่เราต้องการจากทั้งสองฝ่าย
3. ประเภทถ่านสามารถเก็บเป็นภาษาจีนได้หรือไม่?
จากการสำรวจข้างต้นเรารู้อยู่แล้วว่าตัวละครในไฟล์คลาส Java ถูกเข้ารหัสใน UTF-8 และถูกเข้ารหัสและเก็บไว้ใน UTF-16 เมื่อเรียกใช้ JVM ตัวละคร 'จาง' สามารถแสดงได้ด้วยสองไบต์และถ่านก็เป็นสองไบต์ในชวาดังนั้นจึงสามารถเก็บไว้ได้
4. สรุป
หลังจากการวิเคราะห์ข้างต้นเรารู้:
1. อักขระถูกเข้ารหัสในไฟล์คลาสในรูปแบบ UTF-8 และเข้ารหัสในรูปแบบ UTF-16 เมื่อเรียกใช้ JVM
2. ประเภทถ่านเป็นสองไบต์และสามารถใช้ในการจัดเก็บภาษาจีน
ในระหว่างการโทรนี้ฉันอ่านข้อมูลมากมายเกี่ยวกับตัวละครและฉันได้รับประโยชน์มากมายและพบว่ามันน่าสนใจเป็นพิเศษ ฉันจะแบ่งปันต่อไปดังนั้นฉันจะให้การแนะนำสั้น ๆ เกี่ยวกับปัญหาการเข้ารหัสและการเข้ารหัสใน Java คอยติดตาม