텍스트 인코딩 문제를 피하는 쉬운 방법이 있습니까?
텍스트 인코딩 문제를 다루는 것을 피할 수는 없지만 기존 솔루션이 있습니다.
Reader
에서 InputStream
: ReaderInputStream
Writer
에서 OutputStream
: WriterOutputStream
원하는 인코딩을 선택하기 만하면됩니다.
문자열로 시작하는 경우 다음을 수행 할 수도 있습니다.
new ByteArrayInputStream(inputString.getBytes("UTF-8"))
자, Reader는 문자를 처리하고 InputStream은 바이트를 처리합니다. 인코딩은 문자를 바이트로 표현하는 방법을 지정하므로 실제로 문제를 무시할 수 없습니다. 문제를 피하기 위해, 내 의견은 : 하나의 문자 세트 (예 : "UTF-8")를 선택하고 고수하십시오.
실제로 그렇게하는 방법과 관련하여 "이 클래스의 명백한 이름은 ReaderInputStream 및 WriterOutputStream . "놀랍게도" '반대'클래스 인 경우에도 Java 라이브러리 "에 포함되지 않습니다. InputStreamReader 및 OutputStreamWriter가 포함됩니다 .
따라서 많은 사람들이 Apache Commons IO 를 포함한 자체 구현을 생각해 냈습니다. 라이센스 문제에 따라 프로젝트에 commons-io 라이브러리를 포함 시키거나 소스 코드의 일부를 복사 할 수도 있습니다 (다운로드 가능 여기 ).
보다시피, 두 클래스의 문서에는 "JRE가 지원하는 모든 문자셋 인코딩이 올바르게 처리된다"고 명시되어 있습니다.
N.B. 여기에 다른 답변 중 하나에 대한 의견은 this bug 을 언급합니다. 그러나 이는 Apache Ant ReaderInputStream 클래스 ( here ), not Apache 에 영향을줍니다. Commons IO ReaderInputStream 클래스입니다.
또한 String으로 시작하는 경우 Commons IO 에서 다음과 같이 org.Apache.commons.io.IOUtils를 사용하여 StringReader 작성을 건너 뛰고 InputStream을 한 단계로 작성할 수 있습니다.
InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");
물론 여전히 텍스트 인코딩에 대해 생각해야하지만 적어도 한 단계에서 변환이 이루어지고 있습니다.
용도:
new CharSequenceInputStream(html, StandardCharsets.UTF_8);
이 방법으로 String
을 (를) 선결제 한 다음 byte[]
, 보고서가 큰 경우 더 많은 힙 메모리를 할당합니다. StringBuffer에서 스트림을 읽을 때 즉시 바이트로 변환합니다.
Apache Commons IO 프로젝트의 CharSequenceInputStream 를 사용합니다.
텍스트 인코딩 문제는 피할 수 없지만 Apache commons-io
이것들은 koders.com의 Peter의 답변에서 언급 된 라이브러리이며, 소스 코드 대신 라이브러리에 링크되어 있습니다.
이러한 클래스의 명백한 이름은 ReaderInputStream 및 WriterOutputStream입니다. 불행히도 이들은 Java 라이브러리에 포함되어 있지 않지만 google은 친구입니다.
악의적 인 모든 텍스트 인코딩 문제를 해결할지 확실하지 않습니다.
RFE가 있습니다. 닫혔습니다. 수정하지 않습니다.
Reader
의 내용을 OutputStream
에 쓰려고합니까? 그렇다면 OutputStream
에서 OutputStreamWriter
를 감싸는 것이 쉬워지고 char
에서 Reader
에 Writer
s를 씁니다. 독자를 InputStream
로 변환하는 대신 [~ var ~] _ :
final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block
Cactoos (정적 메소드는없고 오브젝트 만)를 사용할 수 있습니다.
다른 방법으로도 변환 할 수 있습니다.
WriterOutputStream 사용시 경고-이진 데이터를 파일에 올바르게/일반 출력 스트림과 동일하게 쓰는 것을 항상 처리하지는 않습니다. 추적하는 데 시간이 걸리는 문제가 있습니다.
가능하면 출력 스트림을 기본으로 사용하는 것이 좋으며 문자열을 작성해야 할 경우 스트림 주위에 OUtputStreamWriter 래퍼를 사용하여 수행하십시오. 텍스트를 다른 방법보다 바이트로 변환하는 것이 훨씬 안정적이므로 WriterOutputStream이 표준 Java 라이브러리의 일부가 아닌 것 같습니다)