InputStream을 UTF-8로 읽기


96

text/plain인터넷을 통해 한 줄씩 파일 을 읽으려고합니다 . 지금 가지고있는 코드는 다음과 같습니다.

URL url = new URL("http://kuehldesign.net/test.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
LinkedList<String> lines = new LinkedList();
String readLine;

while ((readLine = in.readLine()) != null) {
    lines.add(readLine);
}

for (String line : lines) {
    out.println("> " + line);
}

파일 test.txt에는 ¡Hélló!인코딩을 테스트하기 위해 사용하고있는이 포함되어 있습니다 .

OutputStream( out)를 검토하면 > ¬°H√©ll√≥!. 나는 문제 없이 OutputStream할 수 있기 때문에 이것이 문제라고 생각하지 않습니다 out.println("é");.

읽기에 대한 아이디어가 InputStreamUTF-8로 형성 됩니까? 감사!


1
HTTP 프로토콜은 인코딩을 지정합니다. 이를 처리하는 라이브러리 API를 사용하지 않는 이유는 무엇입니까? 이와 같은 인코딩을 추측 할 필요가 없습니다. 나는 부정적인 것을 의미하지 않는다 : 당신은 잘하고있다! 더 쉬운 방법이 없는지 궁금합니다.
tchrist 1

1
text/plain불행히도 파일을 제공하는 서버에 액세스 할 수 없으며 UTF-8 인코딩을 사용하지 않습니다. 나는 좋은 네트워크 라이브러리를 알지 못했습니다. 어떤 제안?
Chris Kuehl

1
문서를 보면 인코딩을 전혀 지정할 필요가 없다고 생각합니다. 나는 그들이 당신에게 바이트 스트림을 제공한다는 것에 놀랐습니다! Content-Encoding을 확인한 다음 올바른 인수로 InputStreamReader를 열 수있는 기본 URLConnection에 액세스 할 수 있습니다. 소스에 대한 빠른 확인은 당신을 위해 그렇게하는 것처럼 보이는 어떤 것도 발견하지 못합니다. 꽤 절뚝 거리고 오류가 발생하기 쉬운 것처럼 보이므로 아마도 뭔가를 놓쳤을 것입니다.
tchrist 1

답변:


189

내 문제를 해결했습니다. 이 줄 :

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

될 필요가있다:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

또는 Java 7부터

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));

3
생성자의 형식이 잘못된 입력에 대한 예외를 발생시키지 않을 것이라고 확신합니다. CharsetDecoder dec인수 와 함께를 사용해야합니다 . 이것은 OutputStreamWriter생성자가 가지고 있는 것과 동일한 Java 디자인 버그 입니다. 네 가지 중 하나만 실제로 무언가 잘못되었을 때 알려주는 것을 믿습니다. 당신은 CharsetDecoder dec역시 거기 에서 멋진 주장 을 사용해야한다 . 할 수있는 유일한 안전하고 건전한 일은 다른 모든 생성자가 작동하도록 신뢰할 수 없기 때문에 더 이상 사용되지 않는 것으로 간주하는 것입니다.
tchrist 1

6
자바 7 이후로는하지 String으로 상수로 문자 집합을 제공 작성할 수 있습니다StandardCharsets.UTF_8
tobijdc

18
String file = "";

try {

    InputStream is = new FileInputStream(filename);
    String UTF8 = "utf8";
    int BUFFER_SIZE = 8192;

    BufferedReader br = new BufferedReader(new InputStreamReader(is,
            UTF8), BUFFER_SIZE);
    String str;
    while ((str = br.readLine()) != null) {
        file += str;
    }
} catch (Exception e) {

}

이 시도,.. :-)


8
파일 + = str 대신 StringBuilder를 생성하고 추가합니다. 컴파일러는 문자열 추가를 최적화 할 수 있지만 많은 쓰레기를 생성 할 수 있습니다
seand

2
BufferedReader를 문자열로 변환하려면 Apache Commons를 사용하고 wheal을 재발 명하지 마십시오. String myStr = org.apache.commons.io.IOUtils.toString (myBufferedReaderInstance);
Jaime Marín 2016 년

8
UTF8 = "UTF8", 좋은 변수)
Nicofisi

7

특수 문자가 로 표시되는 것을 발견 할 때마다 같은 문제가 발생했습니다. 이 문제를 해결하기 위해 ISO-8859-1 인코딩을 사용해 보았습니다.

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("txtPath"),"ISO-8859-1"));

while ((line = br.readLine()) != null) {

}

이 게시물을 보는 모든 사람에게 도움이되기를 바랍니다.


1
UTF-8에서 지원하지 않는 문자가 무엇인지 알려주시겠습니까?
USM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.