2017-03-10 126 views
0

我有以下程序來測試Java如何處理中國字符:爲什麼一箇中文字符需要一個字符(2個字節)而不是3個字節?

String s3 = "世界您好"; 
char[] chs = s3.toCharArray(); 
byte[] bs = s3.getBytes(StandardCharsets.UTF_8); 
byte[] bs2 = new String(chs).getBytes(StandardCharsets.UTF_8); 

System.out.println("encoding=" + Charset.defaultCharset().name() + ", " + s3 + " char[].length=" + chs.length 
       + ", byte[].length=" + bs.length + ", byte[]2.length=" + bs2.length); 

打印出來,這是:

編碼= UTF-8,世界您好炭[]長度= 4 。,字節[]長度= 12,字節[] 2.length = 12

結果是這些:

  1. 如果使用char[]來保存漢字,則一個漢字需要一個char,即2個字節的Java;

  2. 一個漢字需要3個byte s如果用byte[]來保存漢字;

我的問題是如果2個字節就夠了,爲什麼我們用3個字節?如果2個字節是不夠的,爲什麼我們使用2個字節?

編輯:

我的JVM的默認編碼設置爲UTF-8。

+0

您正在使用不同的編碼。你不只是把這些字符的字節。 –

+1

UTF-8編碼每個字符最多可以使用4個字節。見https://en.wikipedia.org/wiki/UTF-8 –

+0

歡迎來到文字編碼的美妙世界。 –

回答

0

Java char類型在雙字節對象中存儲16位數據,並使用每一位來存儲數據。 UTF-8不這樣做。對於中文字符,UTF-8只使用每個字節的6位來存儲數據。其他兩位包含控制信息。 (這取決於字符,對於ASCII字符,UTF-8使用7位)。這是一種複雜的編碼機制,但它允許UTF-8存儲長達32位的字符。這對於7位(ASCII)字符每個字符只有一個字節的優點,使得它向後兼容ASCII。但它需要3個字節來存儲16位數據。您可以通過在維基百科上查找來了解它是如何工作的。

相關問題