1. مقدمة
عند تحليل المقارنة والمقارنة ، تم تحليل طريقة المقارنة لفئة السلسلة. تستخدم السلسلة الأساسية مجموعة char [] لتخزين العناصر. عند المقارنة ، تتم مقارنة شخصيات سلسلتين ، ويتم تخزين الشخصيات باستخدام char. في هذا الوقت ، اعتقدت فجأة أنه يمكن أن تشيرز في Java Store Chinese؟ في وقت لاحق ، وجدت أنه على ما يرام ، وهذا يؤدي أيضًا إلى تنسيق تشفير الأحرف في Java.
2. تنسيق تخزين جافا
في Java ، يحصل الكود التالي على تنسيقات تشفير مختلفة من الحرف "Zhang".
استيراد java.io.unsupportedEncodingException ؛ اختبار الفئة العامة {السلسلة الثابتة العامة getCode (محتوى السلسلة ، تنسيق السلسلة) يلقي UnduportedEncodingException {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) UnsupportedEncodingException {system.out.println ("GBK:" + getCode ("Zhang" ، "GBK")) ؛ System.out.println ("GB2312:" + getCode ("Zhang" ، "GB2312")) ؛ System.out.println ("ISO-8859-1:" + getCode ("Zhang" ، "ISO-8859-1")) ؛ System.out.println ("Unicode:" + getCode ("Zhang" ، "Unicode")) ؛ System.out.println ("UTF-16:" + getCode ("Zhang" ، "UTF-16")) ؛ System.out.println ("UTF-8:" + getCode ("Zhang" ، "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 من الحرف "Zhang" هو نفس ترميز GB2312 ، وأن Unicode هو نفس ترميز UTF-16 ، ولكن كلها ISO-8859-1 ، Unicode ، و UTF-8 ترميز كلها مختلفة. لذلك ، في JVM ، ما هي تنسيق الترميز الذي يتم تخزين الحرف "Zhang"؟ لنبدأ تحليلنا أدناه.
3. استكشف الأفكار السرية
1. عرض تنسيق التخزين لمجموعة ثابت
رمز الاختبار كما يلي
اختبار الفئة العامة {public static void main (string [] args) {String str = "Zhang" ؛ }}استخدم javap -Verbose test.class لإلغاء التجميع وحالة التجميع المستمرة على النحو التالي:
ثم استخدم WinHex لفتح ملف الفصل وتجد أن الحرف "Zhang" يتم تخزينه في مجموعة ثابتة على النحو التالي
ملاحظة: يمكن تخزين اثنين أعلاه في ملف الفئة بتنسيق UTF-8.
ولكن هل هو بتنسيق UTF-8 في وقت التشغيل؟ استمر في رحلتنا في الاستكشاف.
2. اكتشف في البرنامج
استخدم الرمز التالي
اختبار الفئة العامة {public static void main (string [] args) {String str = "Zhang" ؛ System.out.println (integer.toHexString (str.codepointat (0)). touppercase ()) ؛ }}نتائج التشغيل:
5F20
ملاحظة: بناءً على النتائج ، نعلم أنه في وقت التشغيل ، يستخدم JVM تنسيق UTF-16 للتخزين. يتم تخزين UTF-16 بشكل عام مع 2 بايت. إذا تمت مواجهة بايتان ، فسيتم تمثيله بواسطة 4 بايت. سيكون هناك مقال آخر لتقديمه لاحقًا. عندما نتحقق من الكود المصدري لفئة الأحرف ، سنجد أنه مشفر باستخدام UTF-16 ، ووجدنا الإجابة التي نريدها من كلا الجانبين.
3. هل يمكن تخزين نوع Char باللغة الصينية؟
استنادًا إلى الاستكشاف أعلاه ، نعلم بالفعل أن الأحرف في ملفات فئة Java مشفرة في UTF-8 ، ويتم ترميزها وتخزينها في UTF-16 عند تشغيل JVM. يمكن تمثيل شخصية "Zhang" ببايت ، كما أن Char هو أيضًا بايتان في Java ، بحيث يمكن تخزينه.
4. ملخص
بعد التحليل أعلاه ، نعلم:
1. يتم تشفير الأحرف في ملف الفئة بتنسيق UTF-8 ، ويتم ترميزها بتنسيق UTF-16 عند تشغيل JVM.
2. نوع Char هو بايتان ويمكن استخدامه لتخزين الصينية.
خلال هذه المكالمة ، قرأت الكثير من المعلومات حول الشخصيات ، وقد استفدت كثيرًا ووجدتها مثيرة للاهتمام بشكل خاص. سأشاركه بعد ذلك ، لذلك سأقدمها مقدمة موجزة لقضايا الترميز والترميز في Java. ابقوا متابعين