2012-01-13 52 views
17

我所遇到的这条线的遗留代码,我想弄清楚:的Java字符串编码(UTF-8)

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

至于我能理解,它使用的是编码&解码相同的charSet。

这与以下内容有什么不同?

String newString = oldString; 

是否有任何情况下两条线会有不同的输出?

p.s .:只是为了澄清,是的,我知道excellent article on encoding by Joel Spolsky

+8

嗯,当然,*一个*不同的是,'字符串newString = oldString;',你仍然只有字符串的一个副本(你只是指向它来自两个变量)。解码/编码会对字符串进行*复制*。这并不重要,因为'String'是不可变的。尽管这可能不是为什么旧代码是这样的; 'String'有更直接的克隆方式('String(String)')。除了测试String类的编码/解码方法之外,我想不出为什么要进行编码/解码。 – 2012-01-13 16:48:47

+0

上下文是否给出了为什么字符串转换可能已经或者有必要的暗示? – 2012-01-13 16:52:22

+0

@ T.J.Crowder:+1,当然!我并不是指实际对象中的差异。感谢您指出了这一点。 – OceanBlue 2012-01-13 18:14:27

回答

22

这可以做

String newString = new String(oldString); 

的复杂方式这缩短了字符串是[]中使用的底层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 
+0

太棒了!谢谢。 – OceanBlue 2012-01-13 18:22:49

+1

'oldString'未正确编码的唯一原因是因为它不是一个有效的UTF-16(在Java中的字符串的本地表示)字符串。 UTF-8完全能够编码任何和所有的Unicode代码点本身。在这种情况下,只有当'oldString'包含一个无效的UTF-16字节序列时才会有区别。 – Cagatay 2015-09-25 02:53:24

4

这与以下内容有什么不同?

这里这行代码:

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); 

减的细微差别WRT彼得Lawrey解释了他的答案编码。

+0

'String newString = new String(oldString)'将等同于“原始”行我猜 – 2012-01-13 16:57:47