2017-05-06 69 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字符。