यूटीएफ -16 तारों में बाइट गिनती

2 वर्णों की यूटीएफ -16 स्ट्रिंग मेमोरी में केवल 6 बाइट क्यों लेती है, जबकि 1 वर्ण की यूटीएफ -16 स्ट्रिंग 4 बाइट लेती है?

इस व्यवहार को प्रदर्शित करने के लिए जावा में एक एसएससीसीई है:

public class UTF16Test{
    public static void main(String[] args) throws Exception {
        System.out.println("A".getBytes("UTF-16").length);
        System.out.println("AB".getBytes("UTF-16").length);
    }
}

आउटपुट:

4
6
3
जोड़ा संपादित
विचारों: 1
मेरी जिज्ञासा को पूरा करने के लिए, कृपया यह भी करें: 'System.out.println (Arrays.toString ("AB" .getBytes ("UTF-16")) और zwnj;);' धन्यवाद
जोड़ा लेखक rolfl, स्रोत
कभी नहीं, मैंने इसे स्वयं किया: [- 2, -1, 0, 65, 0, 66] - हाँ, बाइट-ऑर्डर-अंक।
जोड़ा लेखक rolfl, स्रोत

1 उत्तर

यूटीएफ -16 के लिए आपको 2-बाइट बाइट-ऑर्डर-मार्क पर विचार करना होगा?

आपके पहले 2 बाइट या तो होंगे: FE FF या FF FE चाहे आप बिग या लिटिल एंडियन मशीन पर हों या नहीं। आपको जांचना चाहिए ...

मैंने किया, और यह [- 2, -1, 0, 65, 0, 66] है।

आपको यह भी मानना ​​चाहिए कि स्ट्रिंग मान स्मृति में यह अतिरिक्त स्थान नहीं लेते हैं, केवल तभी जब स्ट्रिंग को बाइट [] के रूप में एन्कोड किया जाता है, बाइट-ऑर्डर-चिह्न जोड़ा जाएगा .... स्ट्रिंग < कोड> एबी स्मृति में char [2] का उपयोग करेगा जब तक यह बाइट-एन्कोडेड बाइट [6] के रूप में नहीं है।

5
जोड़ा
कुछ detils अद्यतन किया। टिप्पणी पर ध्यान दें कि आपके द्वारा देखे गए बाइट [] मान स्मृति में संग्रहीत किए गए समान नहीं हैं।
जोड़ा लेखक rolfl, स्रोत