Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JSP проблема с кодировкой


Автор: 4epT 15.12.2011, 19:00
Здравствуйте! Имеется jsp:

Код

            <% 
                String category = request.getParameter("category");
            %>
            
            <table>
                <tr>
                    <td>
                        <div class='title' style='padding-left: 50px; padding-bottom: 10px;'>Изменить</div>
                        <form action="ecategory.htm" method="post">
                            <input type="hidden" value='<%= request.getParameter("id") %>' name="id" />
                            <input type="text" class="span5" value='<%= category %>' name="newCategoryName" />
                            <input type="submit" class="btn success" value="Сохранить" />
                            <a href="category.jsp" class="btn danger">Отмена</a>
                        </form>
                    </td>
                </tr>
            </table>


Сюда уже category приходит в неправильной кодировке (не видны русские буквы). 

Данный параметр приходит с другой jsp (которая была сгенерирована сервлетом)

Сервлет вот такой:

Код

                writer.append("<tr>");
                    writer.append("<td>");
                        writer.append("<b>" + list.getString("category") + "</b>");
                    writer.append("</td>");
                    writer.append("<td>");
                        writer.append("<a class='btn primary small' href='categoryEdit.jsp?id=" + list.getInt("id") +
 "&category=" + list.getString("category") + "'>Редактировать</a>");
                    writer.append("</td>");
                    writer.append("<td style='width:100%;'>");
                        writer.append("<a class='btn danger small' href='dcategory.htm?id=" + list.getInt("id") + "'>Удалить</a>");
                    writer.append("</td>");
                writer.append("</tr>");


На самой jsp, в сревлете, в строке параметров все отображается нормально.

был добавлен фильтр:

Код

public class CharsetFilter implements Filter {
  // кодировка
  private String encoding;

  public void init(FilterConfig config) throws ServletException {
    // читаем из конфигурации
    encoding = config.getInitParameter("requestEncoding");

    // если не установлена - устанавливаем Cp1251
    if (encoding == null)
      encoding = "UTF-8";
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
      throws IOException, ServletException {
    request.setCharacterEncoding(encoding);
    next.doFilter(request, response);
  }

  public void destroy() {
  }
}


Пытался везде придерживаться единой кодировки, а именно UTF-8.

Поиск юзал, не один из найденных методов не помог (

Автор: dobrolub 15.12.2011, 21:55
Проверь, стоит ли в jsp таг с contentType@charset

Код

<%@ page contentType="text/html; charset=utf-8" %>


Автор: 4epT 15.12.2011, 22:02
Стоит вот такое:

Код

<%@page contentType="text/html" pageEncoding="UTF-8"%>


Автор: Vasay 15.12.2011, 22:05
4epT, 

Томкэт?

Если да - он настроен на передачу гет параметров в UTF8 ?

Цитата

Edit conf/server.xml and find the line where the Coyote HTTP Connector is defined. It will look something like this, possibly with more parameters: <Connector port="8090"/>

Add a URIEncoding="UTF-8" property to the connector: <Connector port="8090" URIEncoding="UTF-8"/>

Restart Tomcat

Автор: 4epT 15.12.2011, 22:10
Стоит вот такое:

Код

<%@page contentType="text/html" pageEncoding="UTF-8"%>


Решил прооблему путем добавления в server.xml (в коннектор) строки:

Код

URIEncoding="UTF-8"


Если кто то может объяснить именно причину всего этого, буду благодарен )

Автор: Vasay 15.12.2011, 22:33
Цитата(4epT @  15.12.2011,  22:10 Найти цитируемый пост)
Если кто то может объяснить именно причину всего этого, буду благодарен )



По умолчанию TomCat считает что GET параметры  передаются кодировкой, отличной от UTF8 (не помню, какой именно). А Вы пытаетесь передать UTF8 строку.

Цитата

 writer.append("<a class='btn primary small' href='categoryEdit.jsp?id=" + list.getInt("id") +
 "&category=" + list.getString("category") + "'>Редактировать</a>");


Кстати, перед передачей строку нужно URL кодировать, а то могут возникнуть казусы, если в строке окажутся спецсимволы

почитайте про URLEncoder и URLDecoder

Автор: dobrolub 15.12.2011, 22:36
URI encoding не очень хорошо стандартизирован, когда дело касается национальных чарсетов. Это можно обойти с помощью установления параметра на <form

Код

<form enctype="multipart/form-data" method="POST"


В этом случае каждый параметер на сервер придёт с аттрибутом charset и будет раскодирован правильно, и    
URIEncoding="UTF-8" можно будет убрать. 

Автор: Vasay 15.12.2011, 22:42
dobrolub, 
Цитата(dobrolub @  15.12.2011,  22:36 Найти цитируемый пост)
URIEncoding="UTF-8" можно будет убрать. 


Нет, его нельзя будет убрать, если форма передается методом GET. 

К тому же не всегда можно передавать форму, иногда нужно подставить GET параметр прямо в ссылку.

Автор: dobrolub 15.12.2011, 22:46
Верно, правильнее его там оставить.

Автор: 4epT 15.12.2011, 23:37
спасибо, понятно) про URLDecoder/URLEncoder почитаю )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)