W UTF-8, Упячка
powinien być reprezentowany jako \x423\x43F\x44F\x447\x43A\x430
. \xD0\xA3\xD0\xBF\xD1\x8F...
oznacza, że zostały nieprawidłowo zakodowane przy użyciu ISO-8859-1.
Oto fragment testowy, który to potwierdza:
String s = new String("Упячка".getBytes("UTF-8"), "ISO-8859-1"); // First decode with UTF-8, then (incorrectly) encode with ISO-8859-1.
for (char c : s.toCharArray()) {
System.out.printf("\\x%X", (int) c);
}
Które wydruki
\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0
Więc twój problem musi zostać rozwiązany jeden krok wcześniej. Skoro mówisz o aplikacji internetowej Java, a ten ciąg jest prawdopodobnie wynikiem wprowadzania danych przez użytkownika, czy na pewno zadbałeś o kodowanie żądań i odpowiedzi HTTP? Najpierw w JSP musisz dodać następujące elementy na górze JSP:
<%@ page pageEncoding="UTF-8" %>
To nie tylko renderuje stronę w UTF-8, ale także pośrednio ustawia HTTP Content-Type
nagłówek odpowiedzi instruujący klienta, że strona jest renderowana przy użyciu UTF-8, aby klient wiedział, że powinien wyświetlać dowolną treść i przetwarzać dowolne formularze przy użyciu tego samego kodowania.
Teraz część dotycząca żądania HTTP, dla żądań GET należy skonfigurować odpowiedni kontener serwletów. Na przykład w Tomcat jest to kwestia ustawienia URIEncoding
atrybut łącznik HTTP
w /conf/server.xml
odpowiednio. W przypadku żądań POST powinno to być już załatwione przez klienta (przeglądarkę internetową), która jest wystarczająco inteligentna, aby użyć kodowania odpowiedzi określonego w JSP. Jeśli tak się nie stanie, musisz wprowadzić Filter
które sprawdza i zestawy
kodowanie żądania.
Więcej informacji ogólnych można znaleźć w tym artykule przydatne.
Poza tym MySQL ma jeszcze jeden problem ze znakami Unicode. Obsługuje tylko znaki UTF-8 do 3 bajtów , a nie 4 bajty. Innymi słowy, obsługiwany jest tylko zakres BMP wynoszący 65535 znaków, poza nie. Na przykład PostgreSQL w pełni je obsługuje. Może to nie zaszkodzić Twojej aplikacji internetowej, ale z pewnością należy o tym pamiętać.