我可以将String转换为Array作为UTF-8,但是我不能像第一个String那样将它转换回String。
public static void main(String[] args) {
Scanner h = new Scanner(System.in);
System.out.println("INPUT : ");
String stringToConvert = h.nextLine();
byte[] theByteArray = stringToConvert.getBytes();
System.out.println(theByteArray);
theByteArray.toString();
String s = new String(theByteArray);
System.out.println(""+s);
}
如何将theByteArray
打印为字符串?
答案 0 :(得分:12)
String s = new String(theByteArray);
应该是
String s = new String(theByteArray, Charset.forName("UTF-8"));
这里的根本问题是String构造函数不聪明。 String构造函数无法区分正在使用的字符集,并尝试使用系统标准(通常类似于ASCII或ISO-8859-1)对其进行转换。这就是为什么普通的A-Za-z看起来很合适,但其他一切都开始失败了。
byte是从-127到127运行的类型,因此对于UTF-8转换,连续字节需要连接。 String构造函数不可能将其与字节数组区分开来,因此默认情况下它将单独处理每个字节(因此,为什么基本的字母数字将始终工作,因为它们属于此范围)。
示例:
String text = "こんにちは";
byte[] array = text.getBytes("UTF-8");
String s = new String(array, Charset.forName("UTF-8"));
System.out.println(s); // Prints as expected
String sISO = new String(array, Charset.forName("ISO-8859-1")); // Prints 'ããã«ã¡ã¯'
System.out.println(sISO);
答案 1 :(得分:2)
提供的代码有几个问题:
您无法确保从该字符串中获取UTF-8字节数组。
byte[] theByteArray = stringToConvert.getBytes();
返回给定平台上具有默认编码的字节数组,如JavaDoc所述。你真正想做的是以下几点:
byte[] theByteArray = stringToConvert.getBytes("UTF-8");
您应该查看System.out.println()
的{{3}}:
System.out.println(theByteArray);
正在调用System.out.println(Object x)
,这将打印x.toString()
的结果。默认情况下,toString()返回给定对象的内存地址。
所以当你看到表格的输出时:
INPUT:
[B @ 5f1121f6
的inputText
你看到的是theByteArray的内存位置,然后是给定的文本输入行。
您似乎不理解'x.toString()'方法。请记住,Java中的字符串是documentation; String的所有方法都不会改变String。 theByteArray.toString();
返回 theByteArray;
的字符串表示形式。除非您将值赋给另一个String
String arrayAsString = theByteArray.toString();
但是,如前所述,返回的String将是theByteArray
的内存位置。要打印出theByteArray
的内容,您需要将其转换为字符串
String convertedString = new String(theByteArray, Charset.forName("UTF-8"));
假设您的要求是打印转换后的String然后打印原始字符串,您的代码应如下所示:
public static void main(String[] args) {
Scanner h = new Scanner(System.in);
System.out.println("INPUT : ");
String stringToConvert = h.nextLine();
try {
// Array of the UTF-8 representation of the given String
byte[] theByteArray;
theByteArray = stringToConvert.getBytes("UTF-8");
// The converted String
System.out.println(new String(theByteArray, Charset.forName("UTF-8")));
} catch (UnsupportedEncodingException e) {
// We may provide an invalid character set
e.printStackTrace();
}
// The original String
System.out.println(stringToConvert);
}