2012-01-13 90 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