Problem z polskimi znakami

0

Witam

Mam problem z polskimi znakami.
Tworzę projekt w eclipsie używając frameworka Struts2, ustawiłem wszystkie używane przeze mnie typy dokumentów na kodowanie UTF-8, oprócz plików *.properities. Baza danych MySQL 5.1 także założona jest w UTF-8 i collation=utf8_polish_ci. Łączę się z bazą używając kodowania UTF-8 (jdbc:mysql://localhost/mia?characterEncoding=utf-8). W momencie gdy wprowadzam dane z poziomu formularza strony www i zapisuje je do bazy, z powrotem otrzymuję krzaczki (Ä…Ä…) zamiast polskich znaków (ąą). Walczę już z tym parę dobrych godzin i już odpadam.

Wiecie może gdzie jeszcze może być problem ???
Z góry dzięki za pomoc.

0

Czy masz na stronie ustawione kodowanie?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

0
__krzysiek85 napisał(a)

Czy masz na stronie ustawione kodowanie?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Właśnie o to chodzi, że tak. Odchodzę już od zmysłów.

Aplikacja zmienia ąą na ÄÄ już na poziomie przekazania danych klasie. Przy pierwszym wyświetleniu danych pobranych już są krzaczki. Pliki jsp są w UTF-8, strony generowane z jsp też mają kodowanie UTF-8.

Szukałem w eclipsie wszystkich możliwych ustawień kodowań i pozamieniałem na UTF-8 i nadal to samo. :/

0

Sprawdziłeś kodowanie jakie faktycznie jest w bazie używając zupełnie niezależnego od aplikacji wejścia? Bo odpadnie Ci dzięki temu połowa szukania. Jeżeli w bazie masz krzaki, to wiesz, że musisz szukać po stronie zapisu, a jeżeli napisy są ok, to szukasz po stronie odczytu. Oczywiście pod warunkiem, że sprawdzać będziesz na pewno pod UTF-8.
Potem sprawdzałbym debuggerem losy pojedynczego stringa od wprowadzenia aż do ostatniej możliwości sprawdzenia. I odwrotnie - od najprymitywniejszego odczytu bazy. Przydadzą się pułapki warunkowe. Ale to pewnie wiesz. Na pewno jest coś czego nie sprawdziłeś lub sprawdziłeś z błędem.

0

a może: jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=UTF-8

0

Stringa wyświetlam na konsoli zaraz po pobraniu go z formularza z jsp i już w tym momencie są krzaczki. Tak jak wcześniej pisałem jsp ma kodowanie UTF-8. :/ Może gdzieś źle konfiguracje eclips'a ustawiam? Używam eclipse jee galileo pod windows'em.

Próbowałem nawet od nowa tworzyć cały projekt na świeżo skonfigurowanym eclipsie i to też nie dało efektu, nadal krzaczki :/

Zrobiłem jeszcze mały eksperyment. W klasie odbierającej dane z formularza z jsp, do odbieranego stringa przypisałem wartości "ąąśśęę" i wszystko zadziałało, dane zapisały się w bazie poprawnie, odczytane i wyświetlone na stronie też. Z tego wniosek, że podczas przekazywania danych z formularza do klasy obsługującej akcję, aplikacja konwertuje znaki. Jakiś pomysł gdzie to można zmienić???

0

A co ma kodowanie jsp do tego jak uzytkownik wpisuje dane? To tylko okresla jakie kodowanie ma stronka aby wyswietlilo sie poprawnie, tekst wprowadzany przez usera to cos odrebnego, zalezne od ustawien klienta. Sprobuj jakos tak zrobic zeby w metodzie get/post wysylac dodatkowe info jakim jest kodowanie klienta, i na serwerze najpierw zdekodowac do utf-8 a pozniej dopiero przetwarzac. Mozesz to np zrobic polami hidden czy cos.

0
fąfel napisał(a)

A co ma kodowanie jsp do tego jak uzytkownik wpisuje dane? To tylko okresla jakie kodowanie ma stronka aby wyswietlilo sie poprawnie, tekst wprowadzany przez usera to cos odrebnego, zalezne od ustawien klienta. Sprobuj jakos tak zrobic zeby w metodzie get/post wysylac dodatkowe info jakim jest kodowanie klienta, i na serwerze najpierw zdekodowac do utf-8 a pozniej dopiero przetwarzac. Mozesz to np zrobic polami hidden czy cos.

Wielkie dzięki za pomoc !!!

Stworzyłem dodatkowy filtr, który zmienia mi kodowanie żądania i odpowiedzi na "UTF-8" i wszystko hula jak trzeba :)

0

Pochwal sie kodem zeby nastepne pokolenia wiedzialy co zrobic, jesli mozesz. Sam jestem ciekaw jak to wyglada.

0

Oto kod filtra

package struts.web.filters;

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;

/**
 * Servlet Filter implementation class ChangeEncoding
 */
public class ChangeEncoding implements Filter {

    /**
     * Default constructor. 
     */
    public ChangeEncoding() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		response.setCharacterEncoding("UTF-8");
		// System.out.println("Kodowanie response:" + response.getCharacterEncoding());
		request.setCharacterEncoding("UTF-8");
		// System.out.println("Kodowanie request:" + request.getCharacterEncoding());
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

No i podłączenie w web.xml. Filtr musi być pierwszy przed podłączeniem struts'a, bo inaczej nie zadziała.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Test</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <display-name>ChangeEncoding</display-name>
    <filter-name>ChangeEncoding</filter-name>
    <filter-class>struts.web.filters.ChangeEncoding</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>ChangeEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

Pewnie to samo można zrobić w samym filtrze struts'a, ale jakoś już nie chciało mi się szukać rozwiązania tego w ten sposób.

1 użytkowników online, w tym zalogowanych: 0, gości: 1