2011-03-08 3 views
0

다음 프로그램에서 예기치 않은 결과가 나타났습니다.Java 문제 : 일련의 바이트에서 문자열 생성

public class StringFromByte 
{ 
     public static void main(String[] args) 
     { 
      byte bytes[] = new byte[256]; 

      for(int i = 0; i < 256; i++) 
       bytes[i] = (byte)i; 

      String str = new String(bytes); 
      for(int i = 0, n = str.length(); i < n; i++) 
       System.out.print((int)str.charAt(i) + " "); 
     } 
} 

기술적으로이 프로그램은 0부터 255까지의 정수를 순서대로 인쇄해야합니다. 그러나 프로그램을 실행하면 때때로이 시퀀스 (0-255)가 표시되어 다른 시퀀스가 ​​표시되기도합니다. 그것의 행동은 명시되지 않았다. 무슨 일이야?

+1

비 결정적 동작을 설명 할 수는 없지만 한 가지 문제가 있습니다. int 값을 127 이상으로 변환하면 실제로 음의 값을 반환합니다.이 값은 int로 캐스트하면 음수로 남으므로 결정적이라 할지라도 0 -> 255가 출력되지 않습니다. 이것은 문자열에 임의의 바이트를 던지는 것과 관련된 발급 된 인코딩을 처리하지도 않습니다. – rfeak

답변

2

사용중인 String 생성자는 기본 문자 인코딩을 사용합니다. 일부 바이트를 멀티 바이트 문자로 해석 할 수 있습니다.

이 시도 :
  String str = new String(bytes, CharSet.forName("ISO-8859-1")); 

표준 캐릭터 세트 명을 나열, 또한 CharSet API documentation 참조하십시오.

면책 조항 : 일반적으로이 생성자는 UTF-8 용으로 사용됩니다.

+0

하지만 런타임에 인코딩이 어떻게 변경됩니까? 우 메쉬 (Umesh)는 "때로는"질서가 바뀌 었다고 언급했다. 실행 중에 인코딩 효과가 동일하게 유지되면 안됩니까? – peakit

+0

@peakit, 모든 옵션이 같은 플랫폼에서 실행되는지는 분명하지 않았습니다. –

0

글쎄, 처음에는 Java byte 유형이 보유 할 수있는 최대 값은 127 (바이트 데이터 유형은 8 비트 부호있는 2의 보수 정수)입니다.

+0

바이트 캐스팅 된 int를 -127에서 127 사이의 정수로 대체하면 예상되는 결과를 얻을 수 있습니까? –

1

행동이 명시되지 않았습니다.

문자는 바이트와 같지 않지만이 문자를 쓰는 사람은이를 알지 못합니다. 유니 코드에는 약 600 만 자의 문자가 있지만 256 바이트 만 있습니다. 즉, 많은 유니 코드 문자가 두 개 이상의 바이트로 표시됩니다.

예제의 바이트 중 일부는 문자에 2 바이트 이상이 필요하다는 것을 나타내지 만 배열의 "다음"바이트가 유효한 UTF-8 문자와 일치하지 않는다고 생각합니다.

UTF-8이 아닌 바이트 집합에서 올바르게 문자열을 인코딩하려면 use this constructor. 올바른 문자 세트를 제공해야 Java가 문자에 맞는 바이트를 이해할 수 있습니다.

다른 결과가 나타나는 이유는 환경 때문입니다. 각 환경에는 기본 문자 집합을 지정하는 기본 로켈이 있습니다. 사용하고있는 생성자는 항상 UTF-8 문자 집합을 가정하므로 소스 바이트를 오역으로 잘못 해석하는 경우가 있습니다.

0

bytechar으로 바꾸면 예상대로 작동합니다. 그것은 바이트의 최대 127 때문입니다.