Java字符串编码(UTF-8)

我遇到过这一系列遗留代码,我想弄清楚:

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

据我所知,它是使用相同的charSet进行编码和解码。

这与以下有什么不同?

 String newString = oldString; 

是否存在两条线路具有不同输出的情况?

ps:只是为了澄清,是的,我知道Joel Spolsky关于编码的优秀文章 !

这可能是复杂的做法

 String newString = new String(oldString); 

这缩短了String使用的底层char []要长得多。

但更具体地说,它将检查每个字符是否可以是UTF-8编码。

你可以在一个字符串中有一些“字符”,这些字符无法编码,这些字符会被转换成?

\ uD800和\ uDFFF之间的任何字符都无法编码​​并将变为’?’

 String oldString = "\uD800"; String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"); System.out.println(newString.equals(oldString)); 

版画

 false 

这与以下有什么不同?

这行代码在这里:

 String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

构造一个新的String对象(即oldString的副本),而这行代码:

 String newString = oldString; 

声明一个java.lang.String类型的新变量并初始化它以引用与变量oldString相同的String对象。

是否存在两条线路具有不同输出的情况?

绝对:

 String newString = oldString; boolean isSameInstance = newString == oldString; // isSameInstance == true 

 String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); // isSameInstance == false (in most cases) boolean isSameInstance = newString == oldString; 

a_horse_with_no_name(见评论)当然是对的。 相当于

 String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

 String newString = new String(oldString); 

减去Peter Lawrey在他的回答中解释的编码的细微差别。