안전한 인코딩 생성자
Java가 인코딩 오류를 올바르게 알리도록하는 것은 까다 롭습니다. 당신은 사용해야 가장 자세한 그리고, 슬프게도, 적어도 사용되는 각각의 네 개의 다른 contructors의를 InputStreamReader
하고 OutputStreamWriter
인코딩 결함에 적절한 예외를받을 수 있습니다.
파일 I / O의 경우 항상 두 번째 인수 OutputStreamWriter
와 InputStreamReader
멋진 인코더 인수에 대해 항상 사용하십시오 .
Charset.forName("UTF-8").newEncoder()
다른 더 멋진 가능성도 있지만 예외 처리에는 세 가지 간단한 가능성 중 어느 것도 작동하지 않습니다. 다음을 수행합니다.
OutputStreamWriter char_output = new OutputStreamWriter(
new FileOutputStream("some_output.utf8"),
Charset.forName("UTF-8").newEncoder()
);
InputStreamReader char_input = new InputStreamReader(
new FileInputStream("some_input.utf8"),
Charset.forName("UTF-8").newDecoder()
);
달리기에 관해서
$ java -Dfile.encoding=utf8 SomeTrulyRemarkablyLongcLassNameGoeShere
문제는 문자 스트림에 대해 전체 인코더 인수 형식을 사용하지 않으므로 인코딩 문제를 다시 놓칠 수 있다는 것입니다.
더 긴 예
다음은 파일 대신 프로세스를 관리하는 더 긴 예제입니다. 여기서는 두 개의 서로 다른 입력 바이트 스트림과 하나의 출력 바이트 스트림을 모두 전체 예외 처리 를 통해 UTF-8 문자 스트림 으로 승격합니다 .
Process
slave_process = Runtime.getRuntime().exec("perl -CS script args");
OutputStream
__bytes_into_his_stdin = slave_process.getOutputStream();
OutputStreamWriter
chars_into_his_stdin = new OutputStreamWriter(
__bytes_into_his_stdin,
Charset.forName("UTF-8").newEncoder()
);
InputStream
__bytes_from_his_stdout = slave_process.getInputStream();
InputStreamReader
chars_from_his_stdout = new InputStreamReader(
__bytes_from_his_stdout,
Charset.forName("UTF-8").newDecoder()
);
InputStream
__bytes_from_his_stderr = slave_process.getErrorStream();
InputStreamReader
chars_from_his_stderr = new InputStreamReader(
__bytes_from_his_stderr,
Charset.forName("UTF-8").newDecoder()
);
지금 당신은 오류를 인코딩하는 모든 인상 예외가 각각라는 것을 세 가지 문자 스트림을 chars_into_his_stdin
, chars_from_his_stdout
하고 chars_from_his_stderr
.
이것은 문제에 필요한 것보다 약간 더 복잡합니다.이 답변의 전반부에서 솔루션을 제공했습니다. 요점은 이것이 인코딩 오류를 감지하는 유일한 방법이라는 것입니다.
PrintStream
식사 예외 에 대해 시작하지 마십시오 .
InputStreamReader char_input = new InputStreamWriter
읽어야가 :InputStreamReader char_input = new InputStreamReader
및InputStreamReader
생성자가 소요CharsetDecoder
하는 없습니다CharsetEncoder
.