2017-02-20 232 views
1

我試圖將單個字節轉換爲字符串,然後再轉回原始字節。然而,下面的斷言失敗了。任何建議將深表讚賞將單字節轉換爲字符串並返回字節

import org.junit.Test; 
import java.io.UnsupportedEncodingException; 
import static org.junit.Assert.assertEquals; 

    public class ByteTest { 
     private static final String CHARSET = "UTF-8"; 
     @Test 
     public void test() throws UnsupportedEncodingException { 
      byte b = (byte)(220); 
      String s = new String(new byte[]{b}, CHARSET); 
      byte[] parsed = s.getBytes(CHARSET); 
      assertEquals(b, parsed[0]); //fails 
     } 
    } 
+0

'byte'真的不能存儲220 –

+0

單'(字節)220'不是有效的UTF-8編碼的字符串! –

+0

@SteveSmith不,但它可以存儲'-36',它是未簽名的'220'字節的等價符號。這是一回事,你只是以不同的方式解讀它。 – Kayaman

回答

3

字節220(0xDC)本身是無效的UTF-8。 A UTF-8以字節0xA1..0xF5開始的字符需要第二個字節。

嘗試其他編碼,例如ISO-8859-1在Java中實現了1對1字節到字符的往返行程。

public class ByteTest { 
    private static final String CHARSET = "ISO-8859-1"; 

    @Test 
    public void test() throws UnsupportedEncodingException { 
     byte b = (byte) (220); 
     String s = new String(new byte[] { b }, CHARSET); 
     byte[] parsed = s.getBytes(CHARSET); 
     assertEquals(b, parsed[0]); 
    } 
} 
+0

只有幾乎?你能舉一個多字節ISO-Latin1字符的例子嗎? – Kayaman

+0

並非所有的字節值都是有效的ISO-8859-1,所以從技術上講,將字節0x81 .. 0x9F解析爲ISO-8859-1是非法的。但是今天存在的所有Java版本都接受任何字節值作爲有效的ISO-8859-1。 – rustyx