سؤال

لدي نموذج HTML مع العديد من الحقول النصية.

عندما أحاول إرسال أي شخصيات إنجليزية (الروسية في حالتي)، يتم استلام الخادم "غير قابل للقراءة" (وليس أسئلة - "؟؟؟" ولكن بعض الشخصيات الغريبة).

أقوم بتبسيط التعليمات البرمجية لإظهارها هنا:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head><title>Simple jsp page</title></head>
  <body>
    <c:out value="${param.rustext}"/>
    <form action="/test" method="post">
        <input type="text" name="rustext" width="30">
        <input type="submit" value="Submit">
    </form>
  </body>
</html>

كيف يمكنني إصلاح ذلك؟

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

المحلول

يستخدم Tomcat ISO-8859-1 كتشفير الأحرف الافتراضية لمعلمات URL، بغض النظر عن ترميز الصفحة التي تحتوي على عنوان URL. هذا يمكن تغييره مع "uriencoding" سمة في موصلها إعدادات. قد يكون لخوادم التطبيقات الأخرى إعدادات مماثلة.

هذه المقالة يغطي العديد من المشاكل التي تواجهها عادة عند العمل مع JSP.

نصائح أخرى

وأوضح Erickson هذه جيدا في هذه الصفحة. الحل المستقل للخادم هو استخدام عامل تصفية ترميز الأحرف، والخروج la org.springframework.web.filter.characterencodingfilter. انظر المثال أدناه:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {
    private String encoding = "utf-8";
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterChain) throws IOException, ServletException {
        request.setCharacterEncoding(encoding);
        filterChain.doFilter(request, response);
    }
    public void init(FilterConfig filterConfig) throws ServletException {
        String encodingParam = filterConfig.getInitParameter("encoding");
        if (encodingParam != null) {
            encoding = encodingParam;
        }
    }
    public void destroy() {
        // nothing todo
    }
}

في Web.xml أضف إعلان المرشح ورسم خرائط مرشح عنوان URL في الأقسام المناسبة:

  <filter>
  <filter-name>EncodingFilter</filter-name>
  <description>
    <![CDATA[Changes the encoding of the request, in order to help the appserver to correctly interpret request params]]>
  </description>
  <filter-class>com.mypackage.EncodingFilter</filter-class>  
 <init-param>
    <param-name>encoding</param-name>
    <param-value>ISO-8859-15</param-value>
  </init-param>   
</filter>


  <filter-mapping>
      <filter-name>EncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

عند استخدام POST - وهو ما يجب أن تستخدم ترميز TU - يتم إرسال النموذج كإجراء "تطبيق / X-WWW- نموذج URLEncoded". قد تحدد قبول السمات النموذجية - "UTF-8" لتحديد ترميزك.

هذا هو نفسه فيكتور أيونيسكو المقترح، لكن لا تحتاج إلى كتابة مرشح الترميز الخاص بك.

أضف عامل التصفية التالي إلى Web.xml

<filter>
    <filter-name>charsetFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>charsetFilter</filter-name>
    <url-pattern>*.admin</url-pattern>
</filter-mapping>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top