Potrzebuję, aby UTF-8 działał w mojej aplikacji Java (serwlety + JSP, bez frameworka) do obsługi äöå
itp. Dla zwykłego fińskiego tekstu i cyrylicy, jak ЦжФ
w szczególnych przypadkach.
Moja konfiguracja jest następująca:
- Środowisko programistyczne: Windows XP
- Środowisko produkcyjne: Debian
Użyta baza danych: MySQL 5.x
Użytkownicy korzystają głównie z przeglądarki Firefox2, ale do uzyskiwania dostępu do witryny wykorzystywane są również Opera 9.x, FF3, IE7 i Google Chrome.
Jak to osiągnąć?
Odpowiedzi:
Zachęcam do udzielania odpowiedzi na często zadawane pytania na tej stronie. To działa dla mnie:
Przeważnie znaki äåö nie stanowią problemu, ponieważ domyślnym zestawem znaków używanym przez przeglądarki i tomcat / java dla aplikacji internetowych jest latin1, tj. ISO-8859-1, która „rozumie” te znaki.
Aby UTF-8 działał pod Javą + Tomcat + Linux / Windows + Mysql wymaga:
Konfigurowanie serwera.xml serwera Tomcat
Konieczne jest skonfigurowanie, aby łącznik używa UTF-8 do kodowania parametrów adresu URL (żądanie GET):
Kluczową częścią jest URIEncoding = "UTF-8" w powyższym przykładzie. To gwarantuje, że Tomcat obsługuje wszystkie przychodzące parametry GET jako kodowane w UTF-8. W rezultacie, gdy użytkownik zapisze w pasku adresu przeglądarki:
znak ж jest obsługiwany jako UTF-8 i jest zakodowany (zwykle przez przeglądarkę, zanim nawet dostanie się na serwer) jako % D0% B6 .
Nie ma to wpływu na żądanie POST.
CharsetFilter
Następnie nadszedł czas, aby zmusić aplikację Java do obsługi wszystkich żądań i odpowiedzi w postaci zakodowanej w UTF-8. Wymaga to zdefiniowania filtru zestawu znaków, takiego jak:
Filtr ten upewnia się, że jeśli przeglądarka nie ustawiła kodowania użytego w żądaniu, to jest ustawiona na UTF-8.
Inną czynnością wykonaną przez ten filtr jest ustawienie domyślnego kodowania odpowiedzi, tj. kodowanie, w którym zwracany html / cokolwiek jest. Alternatywą jest ustawienie kodowania odpowiedzi itp. W każdym kontrolerze aplikacji.
Ten filtr należy dodać do pliku web.xml lub deskryptora wdrażania aplikacji internetowej:
Instrukcje tworzenia tego filtra można znaleźć na wiki tomcat ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )
Kodowanie strony JSP
W pliku web.xml dodaj:
Alternatywnie, wszystkie strony JSP aplikacji internetowej musiałyby mieć na górze następujące elementy:
Jeśli używany jest jakiś układ z różnymi fragmentami JSP, jest to potrzebne we wszystkich z nich.
Tagi meta HTML
Kodowanie strony JSP informuje JVM, aby obsługiwał znaki na stronie JSP w prawidłowym kodowaniu. Następnie nadszedł czas, aby poinformować przeglądarkę, w którym kodowaniu jest strona HTML:
Odbywa się to w następujący sposób u góry każdej strony xhtml utworzonej przez aplikację internetową:
Połączenie JDBC
Podczas korzystania z bazy danych należy zdefiniować, że połączenie korzysta z kodowania UTF-8. Odbywa się to w pliku context.xml lub wszędzie tam, gdzie połączenie JDBC nie działa, w następujący sposób:
Baza danych i tabele MySQL
Użyta baza danych musi używać kodowania UTF-8. Osiąga się to poprzez utworzenie bazy danych z następującymi elementami:
Następnie wszystkie tabele muszą znajdować się w UTF-8:
Kluczową częścią jest CHARSET = utf8 .
Konfiguracja serwera MySQL
Serwery MySQL również muszą zostać skonfigurowane. Zazwyczaj odbywa się to w Windows modyfikując my.ini -file iw Linux przez skonfigurowanie my.cnf -file. W tych plikach należy zdefiniować, że wszyscy klienci podłączeni do serwera używają utf8 jako domyślnego zestawu znaków oraz że domyślnym zestawem znaków używanym przez serwer jest również utf8.
Procedury i funkcje MySQL
Te również muszą mieć zdefiniowany zestaw znaków. Na przykład:
Żądania GET: latin1 i UTF-8
Jeśli i kiedy zostanie zdefiniowane w pliku server.xml tomcat, że parametry żądania GET są kodowane w UTF-8, następujące żądania GET są obsługiwane poprawnie:
Ponieważ znaki ASCII są kodowane w taki sam sposób zarówno w przypadku latin1, jak i UTF-8, ciąg „Petteri” jest obsługiwany poprawnie.
Cyrylica ж w ogóle nie jest rozumiana w języku łacińskim1. Ponieważ Tomcat jest poinstruowany, aby obsługiwać parametry żądania jako UTF-8, poprawnie koduje ten znak jako % D0% B6 .
Jeśli i kiedy przeglądarki zostaną poinstruowane, aby czytać strony w kodowaniu UTF-8 (z nagłówkami żądań i metatagiem HTML), przynajmniej Firefox 2/3 i inne przeglądarki z tego okresu same kodują znak jako % D0% B6 .
W rezultacie znaleziono wszystkich użytkowników o nazwie „Petteri”, a także wszystkich użytkowników o nazwie „ж”.
Ale co z äåö?
Specyfikacja HTTP określa, że domyślnie adresy URL są kodowane jako latin1. Powoduje to, że firefox2, firefox3 itp. Kodują następujące
w wersji zakodowanej
W Latin1 znak ä jest zakodowany jako % E4 . Mimo że strona / żądanie / wszystko jest zdefiniowane do używania UTF-8 . Wersja ä zakodowana w UTF-8 to % C3% A4
Wynikiem tego jest to, że aplikacja internetowa nie może poprawnie obsługiwać parametrów żądań z żądań GET, ponieważ niektóre znaki są kodowane w latin1, a inne w UTF-8. Uwaga: żądania POST działają, ponieważ przeglądarki kodują wszystkie parametry żądań z formularzy całkowicie w UTF-8, jeśli strona jest zdefiniowana jako UTF-8
Rzeczy do przeczytania
Bardzo dziękuję autorom następujących artykułów za udzielenie odpowiedzi na mój problem:
Ważna uwaga
mysqlobsługuje podstawową płaszczyznę wielojęzyczną przy użyciu 3-bajtowych znaków UTF-8. Jeśli musisz wyjść poza to (niektóre alfabety wymagają więcej niż 3 bajtów UTF-8), musisz użyć smaku
VARBINARY
typu kolumny lubutf8mb4
zestawu znaków (który wymaga MySQL 5.5.3 lub nowszego). Pamiętaj tylko, że użycieutf8
zestawu znaków w MySQL nie będzie działać w 100% przypadków.Tomcat z Apache
Jeszcze jedna rzecz Jeśli używasz łącznika Apache + Tomcat + mod_JK, musisz także wprowadzić następujące zmiany:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
/etc/httpd/conf
i dodaćAddDefaultCharset utf-8
whttpd.conf file
. Uwaga: Najpierw sprawdź, czy istnieje, czy nie. Jeśli istnieje, możesz zaktualizować go o tę linię. Możesz dodać tę linię również na dole.źródło
pageEncoding
, więc możesz je nawet pominąć. 2) w bazie danych MySQL i tabelach, których używałeśutf8_swedish_si
, powinno byćutf8_unicode_ci
. Możesz nawet zostawić zestawienie z dala,CHARACTER SET utf8
wystarczy.<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
2. Przejdź do folderu apache tj./etc/httpd/conf
I dodajAddDefaultCharset utf-8
plik „httpd.conf”. Uwaga: najpierw sprawdź, czy istnieje, czy nie. Jeśli istnieje, możesz zaktualizować go o tę linię. Możesz dodać tę linię również na dole.Myślę, że podsumowałeś to całkiem dobrze we własnej odpowiedzi.
W procesie UTF-8-ing (?) Od końca do końca możesz także chcieć upewnić się, że java używa UTF-8. Użyj parametru -Dfile.encoding = utf-8 jako parametru dla JVM (można skonfigurować w pliku catalina.bat).
źródło
Aby dodać do odpowiedzi kosoant , jeśli używasz Springa, zamiast pisać własny filtr serwletu, możesz użyć
org.springframework.web.filter.CharacterEncodingFilter
dostarczonej przez niego klasy , konfigurując go w następujący sposób w pliku web.xml:źródło
Chcę również dodać stąd, że ta część rozwiązała mój problem z utf:
źródło
Dotyczy to kodowania greckiego w tabelach MySql, gdy chcemy uzyskać do nich dostęp za pomocą Java:
Użyj poniższej konfiguracji połączenia w puli połączeń JBoss (mysql-ds.xml)
Jeśli nie chcesz umieszczać tego w puli połączeń JNDI, możesz skonfigurować go jako adres URL JDBC, jak pokazano w następnym wierszu:
Dla mnie i Nicka, więc nigdy o tym nie zapominamy i tracimy czas .....
źródło
Ładna szczegółowa odpowiedź. Chciałem tylko dodać jeszcze jedną rzecz, która na pewno pomoże innym zobaczyć kodowanie UTF-8 w adresach URL w akcji.
Wykonaj poniższe czynności, aby włączyć kodowanie UTF-8 w adresach URL w Firefoksie.
wpisz „about: config” w pasku adresu.
Użyj typu wejściowego filtru, aby wyszukać właściwość „network.standard-url.encode-query-utf8”.
Kodowanie UTF-8 w adresach URL działa domyślnie w IE6 / 7/8 i chrome.
źródło
Poprzednie odpowiedzi nie działały z moim problemem. To było tylko w produkcji, z tomcat i apache mod_proxy_ajp. Ciało postu straciło znaki nie ascii przez? Ostatecznie problem dotyczył JVM defaultCharset (US-ASCII w domyślnej instalacji: Charset dfset = Charset.defaultCharset ();), więc rozwiązaniem było uruchomienie serwera tomcat z modyfikatorem do uruchomienia JVM z UTF-8 jako domyślnym zestawem znaków:
(dodaj ten wiersz do catalina.sh i uruchom ponownie serwis tomcat)
Być może musisz również zmienić zmienną systemową linux (edytuj ~ / .bashrc i ~ / .profile, aby zmienić na stałe, patrz https://perlgeek.de/en/article/set-up-a-clean-utf8-environment )
źródło
Mam podobny problem, ale w nazwach plików kompresuję się przy użyciu apache commons. Rozwiązałem to za pomocą tego polecenia:
działa dla mnie bardzo dobrze. Mam nadzieję, że pomoże każdemu;)
źródło
W moim przypadku wyświetlania znaku Unicode z pakietów wiadomości nie muszę stosować sekcji „Kodowanie strony JSP”, aby wyświetlać Unicode na mojej stronie jsp. Wszystko czego potrzebuję to sekcja „CharsetFilter”.
źródło
Jeszcze jeden punkt, o którym nie wspomniano, dotyczy serwletów Java współpracujących z Ajax. Mam sytuacje, w których strona internetowa pobiera tekst utf-8 od użytkownika wysyłającego go do pliku JavaScript, który zawiera go w identyfikatorze URI wysyłanym do serwletu. Serwlet wysyła zapytanie do bazy danych, przechwytuje wynik i zwraca go jako plik XML do pliku JavaScript, który go formatuje i wstawia sformatowaną odpowiedź na oryginalnej stronie internetowej.
W jednej z aplikacji internetowych postępowałem zgodnie z instrukcjami wczesnej książki Ajax, aby zakończyć JavaScript w konstruowaniu identyfikatora URI. W podanym w książce przykładzie użyto metody escape (), którą odkryłem (trudną drogą). W przypadku utf-8 musisz użyć encodeURIComponent ().
Niewiele osób wydaje się obecnie tworzyć własne Ajax, ale pomyślałem, że równie dobrze mogę to dodać.
źródło
O
CharsetFilter
wymienionych w odpowiedzi na @kosoant ....W
Filter
tomcat znajduje się wbudowana wersjaweb.xml
(zlokalizowana podconf/web.xml
). Filtr nazywa sięsetCharacterEncodingFilter
i jest domyślnie komentowany. Możesz to odkomentować (pamiętaj, aby też odkomentowaćfilter-mapping
)Również nie ma potrzeby ustawiania
jsp-config
w twoimweb.xml
(przetestowałem to dla Tomcat 7+)źródło
Czasami możesz rozwiązać problem za pomocą kreatora administratora MySQL. W
i ustaw Def. zestaw znaków: utf8
Być może ta konfiguracja wymaga ponownego uruchomienia MySQL.
źródło
Ten sam problem wystąpił na Spring MVC 5 + Tomcat 9 + JSP.
Po długich badaniach, przyszedł eleganckie rozwiązanie ( nie ma potrzebę filtrów i żadnych potrzebę zmian w Tomcat server.xml (począwszy od wersji 8.0.0-RC3))
W implementacji WebMvcConfigurer ustaw domyślne kodowanie dla messageSource (do odczytu danych z plików źródłowych komunikatów w kodowaniu UTF-8.
W implementacji DispatcherServletInitializer @ Przestaw metodę onStartup i ustaw w niej kodowanie znaków żądania i zasobów.
Zapisz wszystkie źródła wiadomości i przeglądaj pliki w kodowaniu UTF-8.
Dodaj <% @ page contentType = "text / html; charset = UTF-8"%> lub <% @ page pageEncoding = "UTF-8"%> w każdym pliku * .jsp lub dodaj deskryptor jsp-config do pliku web.xml
źródło
Jeśli podałeś w puli połączeń (mysql-ds.xml), w kodzie Java możesz otworzyć połączenie w następujący sposób:
źródło