나는 조금 놀란 뭔가를 만났다. 적절한 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 % 확신 할 수 없을 때가 있습니다.
는
Javadoc : _ "이 메서드는 항상 잘못된 형식의 입력 및 매핑 할 수없는 문자 시퀀스를이 charset의 기본 대체 문자열로 바꿉니다. 디코딩 프로세스에 대한 제어가 필요할 때 CharsetDecoder 클래스를 사용해야합니다. –
네, 그렇 겠지요. 아직 나에게 명확하지 않다는 것이 _ 구현 된 것입니다. 마치 ... 언제 이것이 유용한 행동입니까? 이것은 내가 기대하는 바를하지 않고 그것에 대해 내게 말하지 않는 것처럼 보입니다. –