2016-10-10 6 views
0

나는 조금 놀란 뭔가를 만났다. 적절한 utf-8이 아닌 바이트에서 문자열을 만들려고 할 때 String 생성자가 여전히 결과를 제공합니다. 예외는 발생하지 않습니다. 예 : 자바 문자열 생성자의 오류를 무시하는 것 같다어떻게 java.lang.String은 인코딩의 유효성을 검사하지 않습니까?

>>> '\xf0\xab'.decode('utf-8') 
    Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode 
     return codecs.utf_8_decode(input, errors, True) 
    UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: unexpected end of data 

그래서 이유는 다음과 같습니다 다소 명확 오류 메시지와 함께, 예를 들어 파이썬은 또한 오류를 제공하기위한에서 같은 일을 시도

byte[] x = { (byte) 0xf0, (byte) 0xab }; 
new String(x, "UTF-8"); // This works, or at least gives a result 

// This however, throws java.nio.charset.MalformedInputException: Input length = 3 
ByteBuffer wrapped = ByteBuffer.wrap(x); 
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); 
decoder.decode(wrapped); 

입력?

업데이트 : 좀 더 명확해야합니다. javadoc은 이것이 지정되지 않았 음을 지적합니다. 그런데 이런 식으로 구현하는 이유는 무엇일까요? 저에게 당신은 이런 종류의 행동을 원하지 않을 것입니다. 그리고 CharsetDecoder를 안전하게 사용하기 위해 소스를 100 % 확신 할 수 없을 때가 있습니다.

+2

Javadoc : _ "이 메서드는 항상 잘못된 형식의 입력 및 매핑 할 수없는 문자 시퀀스를이 charset의 기본 대체 문자열로 바꿉니다. 디코딩 프로세스에 대한 제어가 필요할 때 CharsetDecoder 클래스를 사용해야합니다. –

+0

네, 그렇 겠지요. 아직 나에게 명확하지 않다는 것이 _ 구현 된 것입니다. 마치 ... 언제 이것이 유용한 행동입니까? 이것은 내가 기대하는 바를하지 않고 그것에 대해 내게 말하지 않는 것처럼 보입니다. –

답변

1

String(byte[], String)에 대한 Java 문서는 말한다 :

이 생성자의

동작하면 지정된 캐릭터 세트로 지정된 바이트가 가 지정입니다 에 유효하지 않은 경우. 디코딩 프로세스에 대한 더 많은 제어가 필요할 때 CharsetDecoder 클래스는 이어야합니다.

그대 생성자 String(byte[], Charset)은 또 다른 문제를 가지고

이 방법은 항상 대체 부정 입력 순서 나 맵 불가 문자이 캐릭터 세트의 기본 대체 문자열와 시퀀스. CharsetDecoder 클래스는 디코딩 프로세스에 대한 더 많은 제어가 필요할 때 사용해야합니다.

나는 파이썬의 행동을 더 좋아한다. 하지만 자바가 파이썬과 똑같을 것이라고 기대할 수는 없습니다.

+0

String (byte [], String)과 String (byte [], Charset) 사이의 차이점을 실제로 알지 못했습니다. 그것은 그것이 심지어 낯선 사람이라고 생각합니다. :) –