Tomcat, servlet, polskie litery

0

Testy robię na XP SP3, Tomcat 6.0.20
Problem jest następujący. Na serwerze znajduje się plik tekstowy z kodowaniem iso-8859-2. Chcę go (po zrobieniu z niego HTML-a i pewnych zmianach) wyświetlić za pośrednictwem servletu w przeglądarce. Jak uniknąć krzaczków? Najbliżej celu jestem w takim rozwiązaniu:
Czytanie pliku:

   StringBuffer sb=new StringBuffer("");
   BufferedReader br=new BufferedReader(new FileReader(...));
   while(br.ready())
   {
       sb.append(br.readLine()+"\n");
   }
   br.close();
   String result=sb.toString();

Odesłanie pliku:

  response.setContentType("text/html; charset=windows-1250"); //przy iso-8859-2 jest zupełnie źle
  ...
  out.println("<!DOCTYPE DOCTYPE PUBLIC \"-//W3C//DTD HTML 4.0 Final//EN\">");
  out.println("<html>");
  out.println("<head>");
  out.println("<title>"+fileName+"</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-2\"></head>");
  out.println("<body><pre>");
  //tu jest chwilowo niewykonywane przetwarzanie zmiennej result
  out.write(result);
  out.println("</pre></body></html>");

Otrzymuję poprawny plik z niepoprawnym nagłówkiem:

...
Content-Type: text/html;charset=windows-1250
...

W przeglądarce widać plik z usuwalnymi krzakami (Widok => Kodowanie znaków).

0

A jak tworzysz tego strumienia co wczytuje plik? IMHO, musisz odtorzyc FileInputStream, opakowac go w StreamInputReader i w tym momencie podac kodowanie. Przy wczytaniu zostanie wczytany poprawny string, i teraz juz mozesz ustawic kodowanie w HttpServletRequest.setCharacterEncoding (musisz wywolac ta metode zanim wywolasz getWriter).
Powiedz czy cos to zmienia.

Z innej beczki - wczytywanie calego pliku do pamieci i nastepnie wywalanie do writera jest kiepskim pomyslem, powinienes zaimplementowac cos bardziej stumienio-podobne (czyli np linijka po linijkce od razu wywalac do writra, ktory z kolei od razu moze wywalac do klienta /jak przekroczysz jego bufor/). Ale znajac Cie to wiesz o tym, i ten kod ktory pokazales to tymczasowe.
Jeszcze z innej beczki - laczenie prezentacji z kodem w servlecie to pomysl z poznych lat 90-tych, ale to tez na pewno wiesz ;d

0

Po kolei:

  1. Nie tworzę żadnego strumienia do czytania pliku, czytam przy pomocy Readera
String fileName=request.getParameter("file");        
String path=getServletContext().getRealPath(fileName) 
BufferedReader br=new BufferedReader(new FileReader(path));

Nie wiem jak wykorzystać Twoją propozycję, nie mogę znaleźć StreamInputReader.
2. Pliki są nieduże (parę kB), niekiedy będą trochę zmieniane, a zmiana może zależeć od zawartości kilku kolejnych wierszy. Zatem wersja z wczytaniem całego pliku jest niestety ostateczna.
3. Łączenie prezentacji z kodem też mi się nie podoba. Na razie nie znalazłem innego rozwiązania.

0
bogdans napisał(a)
  1. Łączenie prezentacji z kodem też mi się nie podoba. Na razie nie znalazłem innego rozwiązania.

Zrob include'a tych plikow z poziomu RequestDispatcher'a. Przekaz mu wlasny ServletResponseWrapper, w ktorym zajmiesz sie obsluga kodowania. Rozwiazanie wygodniejsze i bardziej Java-friendly. I nie bedziesz musial grzebac w serwlecie, gdy zajdzie potrzeba cos zmienic.

0

Powinieneś zerknąć na tą klasę: http://download.oracle.com/javase/6/docs/api/java/io/InputStreamReader.html
Tam jest opis jak jej użyć i można w konstruktorze ustawić kodowanie na ISO-8859-2. Potem w servlecie możesz to wysłać w dowolnym innym kodowaniu.

0

@bo: alez uzywasz strumienia, FileReader uzywa go wewnetrznie, jak i InputStreamReadera ktory uzywa domyslnego kodowania platformy. Pomylilem nazwe klasy, pomylilem kolejnosc slow w nazwie, chodnik ma oczywiscie racje. Jak uzywasz wlasnego InputStreamReadera to mozesz ustawic kodowanie:
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), "ido-8859-2"));

0

@::., nie wiedziałem, że mówię prozą :-).
Wasze rozwiązanie (Ty i @chodnik) pomogło.

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