2010-11-22 7 views
2

기본 설정 인 Tomcat 7과 java 관련 utf-8을 사용하도록 구성되었습니다.Tomcat의 JspWriter가 올바르게 인코딩되지 않았습니다.

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> 
<%@ page import="java.net.*" %> 
<%@ page import="java.io.*" %> 
<% 
    URL target = new URL("http://en.wikipedia.org/wiki/Main_Page"); 
    Reader input = new BufferedReader(new InputStreamReader(target.openStream())); 
    StringWriter buffer = new StringWriter(); 
    char[] chrs = new char[1024 * 4]; 
    int n = 0; 
    while (-1 != (n = input.read(chrs))) 
    { 
     buffer.write(chrs, 0, n); 
    } 
    StringReader reader = new StringReader(buffer.toString()); 
    n = 0; 
    while (-1 != (n = reader.read(chrs))) 
    { 
     out.write(chrs, 0, n); 
    } 
%> 

이는 않지만, 로그 IllegalStateExceptions :

이 작동하지 않습니다 (UTF-8 문자가 엉망이다)

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> 
<%@ page import="java.net.*" %> 
<%@ page import="java.io.*" %> 
<% 
    URL target = new URL("http://en.wikipedia.org/wiki/Main_Page"); 
    Reader input = new BufferedReader(new InputStreamReader(target.openStream())); 
    StringWriter buffer = new StringWriter(); 
    char[] chrs = new char[1024 * 4]; 
    int n = 0; 
    while (-1 != (n = input.read(chrs))) 
    { 
     buffer.write(chrs, 0, n); 
    } 
    StringReader reader = new StringReader(buffer.toString()); 
    OutputStreamWriter output = new OutputStreamWriter(response.getOutputStream()); 
    n = 0; 
    while (-1 != (n = reader.read(chrs))) 
    { 
     output.write(chrs, 0, n); 
    } 
%> 

내가 찾던하지만 답을 찾을 수 없습니다. 이것은 Tomcat의 버그입니까, 아니면 제가 빠진 것이 있습니까?

+0

이것은 데이터베이스를 포함하지 않고 문제를 전시 한 가장 간단한 예입니다. 실제 코드는 아무 것도 보이지 않습니다. – OrangeDog

답변

3

charset을 두 번째 인수로 지정하지 않고 InputStreamReader을 구성하면 플랫폼 기본 인코딩 인 ISO-8859-1이 사용됩니다. 대상 URL (UTF-8)의 응답 헤더에 지정된 것과 동일한 문자 집합을 지정해야합니다. 당신은 서블릿 대신 JSP에서이 일을하고 있기 때문에

input = new BufferedReader(new InputStreamReader(target.openStream(), "UTF-8")); 

IllegalStateException

발생합니다. JSP는 내부적으로 response.getWriter()을 사용하지만 스크립틀릿에서 response.getOutputStream()을 호출합니다. javadocs에서 설명한 것처럼 동시에 수행 할 수는 없습니다. 또한 이중 루프는 효율적이지 않습니다. 그냥 어떤 버퍼 대신 첫 번째 루프에서 out (즉 response.getWriter())에 즉시 쓰십시오.

어쨌든 이것은 대단한 프록시입니다. 오히려 서블릿을 사용하거나 JSTL <c:import>을 잡으십시오.

<c:import url="http://en.wikipedia.org/wiki/Main_Page" /> 
+0

고마워, 나는 기회가있을 때 그걸 줄거야. – OrangeDog

관련 문제