2009-05-07 2 views
3

내가 뭔가를 디버깅하기 위해 노력하고있어 다음과 같은 코드가 이제까지비어 있지 않은 UTF-8 바이트 배열에서 빈 Java 문자열을 만들 수 있습니까?

public boolean impossible(byte[] myBytes) { 
    if (myBytes.length == 0) 
    return false; 
    String string = new String(myBytes, "UTF-8"); 
    return string.length() == 0; 
} 

나는 true를 돌려줍니다 그 전달할 수있는 값이 true를 돌려 수 있는지 궁금하네요? 필자는 2 바이트 시퀀스의 첫 번째 바이트 만 통과시키지 만 여전히 하나의 문자열을 생성합니다.

분명히하기 위해 GCJ를 통해 컴파일 된 Java 1.4 코드의 PowerPC 칩에서 원시 바이너리 실행 파일이 발생했습니다. 이것은 기본적으로 대부분의 배팅이 꺼져 있음을 의미합니다. Java의 '정상적인'동작 또는 Java의 스펙이 어떤 약속을했는지 궁금합니다.

답변

0

UTF-8은 대부분의 "일반"문자가 1 바이트 인 가변 길이 인코딩 체계입니다. 따라서 주어진 비어 있지 않은 바이트 []는 항상 문자열로 변환됩니다.

재생하려면 모든 가능한 바이트 값을 반복하고 해당 값의 단일 값 배열을 전달하며 문자열이 비어 있지 않다는 것을 주장하는 단위 테스트를 작성하십시오.

1

가능합니다.

Java 5 API docs로부터 「지정된 캐릭터 세트로 지정된 바이트가 유효하지 않은 경우의이 생성자의 동작은 지정되지 않습니다.」

나는 그것이에 따라 추측 : 워드 프로세서가 지정되지 않은 "말을하면 당신은 당신의 JVM (썬, HP, IBM, 오픈 소스 하나, 등)

을 썼다 공급 업체 을 사용하고있는 자바의 어떤 버전 "모든 베팅은

편집 떨어져 있습니다 Trey 하여 구타 자바 (나는 그들이 아직 고정 여부를 모르겠어요있는) 올바르게 BOM mark을 처리하는 경우 CharsetDecoder

1

사용에 대한 그의 조언을 받아, 다음 그것을 입을 수 있어야합니다. t BOM (U + FEFF, UTF-8 바이트 시퀀스 EF BB BF)이있는 바이트 배열. 빈 문자열을 얻습니다.


업데이트 :

나는 1-3 바이트의 모든 값과 그 방법을 시험했다. 그들 중 누구도 Java 1.6에서 빈 문자열을 반환하지 않았습니다. 다음은 다른 바이트 배열 길이와 함께 사용한 테스트 코드입니다.

public static void main(String[] args) throws UnsupportedEncodingException { 
    byte[] test = new byte[3]; 
    byte[] end = new byte[test.length]; 

    if (impossible(test)) { 
     System.out.println(Arrays.toString(test)); 
    } 
    do { 
     increment(test, 0); 
     if (impossible(test)) { 
      System.out.println(Arrays.toString(test)); 
     } 
    } while (!Arrays.equals(test, end)); 

} 

private static void increment(byte[] arr, int i) { 
    arr[i]++; 
    if (arr[i] == 0 && i + 1 < arr.length) { 
     increment(arr, i + 1); 
    } 
} 

public static boolean impossible(byte[] myBytes) throws UnsupportedEncodingException { 
    if (myBytes.length == 0) { 
     return false; 
    } 
    String string = new String(myBytes, "UTF-8"); 
    return string.length() == 0; 
} 
+0

불행히도 Java는 UTF-8 BOM을 올바르게 처리하지 못합니다. 전혀 처리하지 않습니다. 콘텐츠의 일부로 취급합니다. –