2010-04-14 3 views
0
byte[] bytes = new byte[] { 1, -1 }; 
System.out.println(Arrays.toString(new String(bytes, "UTF-8").getBytes("UTF-8"))); 
System.out.println(Arrays.toString(new String(bytes, "ISO-8859-1").getBytes("ISO-8859-1"))); 

출력 :디코드 인코딩

[1, -17, -65, -67] 
[1, -1] 

이유 ???

+0

http://stackoverflow.com/questions/2544965/why-new-stringbytes-enc-getbytesenc-does-not-return-the-original-byte-array – Bozho

답변

6

귀하의 바이트 배열이 유효한 UTF-8 인코딩 된 문자열이 아닌 ... 그래서 문자열이

new String(bytes, "UTF-8") 

에서 얻을은 (첫 번째 바이트) + 0001 U와 U + FFFD는 의미에 포함 두 번째 바이트의 잘못된 데이터 해당 문자열이 UTF-8을 사용하여 인코딩되면 바이트 패턴이 표시됩니다.

기본적으로 임의의 이진 데이터가 특정 인코딩으로 인코딩 된 것처럼 해석해서는 안됩니다. 임의의 2 진 데이터를 문자열로 나타내려면 base64와 같은 것을 사용하십시오.

+0

감사합니다. Jon. 하지만 base64에 익숙하지 않습니다. base64가 데이터를 손실하는 경우 모든 바이트를 어떻게 지원합니까? – seven

+0

@seven : 정확히 무엇을 의미하는지 모르겠다.하지만 불투명 한 바이너리 데이터를 ASCII로 변환한다. 이것은 일반적으로 쉽게 전송할 수있다. –

+0

ASCII 알파벳에 포함되지 않은 일부 바이트를 ASCII로 변환 할 수 있습니까? 감사. – seven

2

-1은 유효한 UTF-8 인코딩 문자가 아닙니다. [-17, -65, -67]은 대용 할 가능성이있는 replacement character의 바이트 표현입니다.

0

문자열 이진 데이터의 컨테이너가 아닙니다. char의 컨테이너입니다. -1은 char에 유효한 값이 아닙니다. 당신이하고있는 일이 항상 효과가있을 이유가 없습니다. 어고,하지 마.