2013-04-26 261 views
5

爲什麼此junit測試失敗?Java字節[]到/從字符串轉換

import org.junit.Assert; 
import org.junit.Test; 

import java.io.UnsupportedEncodingException; 

public class TestBytes { 
    @Test 
    public void testBytes() throws UnsupportedEncodingException { 
     byte[] bytes = new byte[]{0, -121, -80, 116, -62}; 
     String string = new String(bytes, "UTF-8"); 
     byte[] bytes2 = string.getBytes("UTF-8"); 
     System.out.print("bytes2: ["); 
     for (byte b : bytes2) System.out.print(b + ", "); 
     System.out.print("]\n"); 
     Assert.assertArrayEquals(bytes, bytes2); 
    } 
} 

我假設到來的字節數組等於結果,但不知何故,可能是由於這樣的事實,UTF-8字符取兩個字節,勝負陣列從在內容和長度傳入陣列不同。

請賜教。

回答

3

原因是0, -121, -80, 116, -62不是有效的UTF-8字節序列。新的字符串(字節,「UTF-8」)在這種情況下不會拋出任何異常,但結果很難預測。閱讀http://en.wikipedia.org/wiki/UTF-8無效的字節序列部分。

+0

尤其是UTF-8不能表示所有字節序列。 – 2013-04-26 08:47:22

+0

謝謝。我非常想將這些字節存儲在字符串中。是否有任何支持_any_字節序列的編碼,還是我必須用我在上面的junit測試中打印它的方式來表示它? – eirirlar 2013-04-26 08:48:58

+2

嘗試ISO-8859-1它將字節轉換爲字符1到1 – 2013-04-26 08:49:57

1

數組字節包含負值指示值,這些值被設置爲第8位(bit7),並以多字節序列的形式轉換爲UTF-8。如果僅使用範圍爲0..127的值的字節,則字節2將與字節相同。要給出一個字節副本,可以使用例如arraycopy方法:

byte[] bytes3 = new byte[bytes.length]; 
    System.arraycopy(bytes, 0, bytes3, 0, bytes.length); 
+0

感謝您澄清第8位。 – eirirlar 2013-04-26 08:57:09