2017-05-06 26 views
1

我正在讀取getbytes並從文檔中指出它將返回 結果字節數組String.getBytes()返回Unicode字符數組

但是當我運行下面的程序時,我發現它是返回Unicode符號數組。

public class GetBytesExample { 
    public static void main(String args[]) { 
     String str = new String("A"); 
     byte[] array1 = str.getBytes(); 
     System.out.print("Default Charset encoding:"); 
     for (byte b : array1) { 
      System.out.print(b); 
     } 

    } 
} 

上述程序打印輸出

Default Charset encoding:65 

65相當於A Unicode表示。我的問題是,哪裏是預期返回類型的字節。

+0

你期望這種方法返回什麼?你只是打印返回數組的每個字節,所以他們肯定在那裏。你的期望是什麼? –

+1

*「我的問題返回類型的字節在哪裏。」*在變量'b'中?很不清楚你的代碼問題是什麼。 – Tom

+3

「數組中的字節」Well ...「在哪裏。當你打印該數組的元素時,你只是誤解了正在發生的事情。 –

回答

4

沒有PrintStream.print(byte)過載,所以需要加寬byte來調用該方法。

JLS 5.1.2

19對原始類型特定的轉換被稱爲寬元的轉換:

  • 字節short,int和長整型,浮點或雙
  • ...

沒有PrintStream.print(short)重載。

下一個最具體的是PrintStream.print(int)。這就是被調用的那個,因此你看到了字節的數值。

1

String.getBytes()使用平臺編碼返回字符串的編碼。結果取決於你運行這臺機器。如果平臺編碼爲UTF-8或ASCII或ISO-8859-1或其他幾種,則'A'將被編碼爲65(又名0x41)。

1

這65相當於阿

相當於阿

相當於一個ASCII表示的UTF-8表示Unicode表示A

它是相當於ISO/IEC 8859-1表示A

恰巧A的編碼在很多字符編碼中是相似的,而且這些編碼都與Unicode編碼點相似。這不是巧合。這是字符集/字符編碼標準歷史的結果。


我的問題是,哪裏是它的返回類型預期的字節數。

在字節數組,當然:-)

你(只是)曲解他們。

當你這樣做:

for (byte b : array1) { 
     System.out.print(b); 
    } 

你輸出一系列字節與他們之間沒有空格十進制數。這與Java區分文本/字符數據和二進制數據的方式一致。字節是二進制的。 getBytes()方法給出字符串中文本的二進制編碼(在某些字符集中)。然後格式化並打印二進制文件(一次一個字節)作爲十進制數字。

如果您想獲得更多證據,請將"A"文字替換爲包含(說)一些中文字符的文字。或者使用\u語法表示的任何大於\u00ff的Unicode字符。