Java 字符串构造函数来处理产生奇怪结果的字节数组

Java 字符串构造函数来处理产生奇怪结果的字节数组,java,string,byte,Java,String,Byte,我使用隐式字符串构造函数来处理字节数组..但结果很奇怪。我是否需要做更多的事情来获得正确的输出。。?任何帮助都将不胜感激。这是我的密码 byte[] arr = { 23, 34, 20, 65, 88, 95 }; String s1 = new String(arr); System.out.println("First: "+s1); String s2 = new String(arr, 1, 3); System.out.

我使用隐式字符串构造函数来处理字节数组..但结果很奇怪。我是否需要做更多的事情来获得正确的输出。。?任何帮助都将不胜感激。这是我的密码

    byte[] arr = { 23, 34, 20, 65, 88, 95 };

    String s1 = new String(arr);
    System.out.println("First: "+s1);

    String s2 = new String(arr, 1, 3);
    System.out.println("Second: "+s2);
它打印:

第一个:?“?斧头_

第二:斧头


这是正确的。这些是您提供的代码的字符。如果将字节数组更改为此,您将看到字符a-f:

byte[] arr = { 97, 98, 99, 100, 101, 102 };
您使用的
String()
构造函数正在根据Java环境的默认字符集解释数组中的字节。这可能有所不同


如果要使用特定的字符编码,如“US-ASCII”或“UTF-8”,则应使用不同的构造函数指定字符集,例如:.

您的预期输出是什么?23和20是不可打印的字符,34是
,65是
a
,88是
X
,95是
\u
@rgetman:是的,你是对的,我刚试过从65开始,就像我的书的例子一样,它打印得很好..但是这是怎么发生的呢protip:养成明确指定编码的习惯。。