سؤال

لديّ إعداد افتراضي لـ Tomcat 7 وكل شيء مرتبط بـ Java لاستخدام UTF-8.

هذا لا يعمل (أحرف 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());
    n = 0;
    while (-1 != (n = reader.read(chrs)))
    {
        out.write(chrs, 0, n);
    } 
%>

هذا لا ، ولكن سجلات غير قانونية:

<%@ 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 ، أم أن هناك شيء أفتقده؟

هل كانت مفيدة؟

المحلول

عندما تنشئ InputStreamReader دون تحديد charset كوسيطة ثانية ، سيتم استخدام الترميز الافتراضي للنظام الأساسي ، والذي غالبًا ما يكون ISO-8859-1. تحتاج إلى تحديد نفس Charset كما هو محدد في رأس الاستجابة لعنوان URL المستهدف ، وهو UTF-8.

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

ال IllegalStateException ناجمة لأنك تفعل هذا في JSP بدلاً من servlet. يستخدم JSP داخليًا response.getWriter(), ، لكنك تتصل response.getOutputStream() في JSP النص. لا يمكن القيام بذلك في وقت واحد كما هو موضح في Javadocs. أيضا ، الحلقة المزدوجة بعيدة عن الكفاءة. فقط اكتب على الفور إلى out (الذي response.getWriter()) في الحلقة الأولى بدلاً من بعض المخزن المؤقت.

بغض النظر ، هذه طريقة فظيعة للوكيل. بدلاً من ذلك ، استخدم Servlet أو Grab JSTL <c:import> في حين أن.

<c:import url="http://en.wikipedia.org/wiki/Main_Page" /> 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top