V UTF-8, Упячка
by mělo být ve skutečnosti reprezentováno jako \x423\x43F\x44F\x447\x43A\x430
. \xD0\xA3\xD0\xBF\xD1\x8F...
znamená, že byly nesprávně zakódovány pomocí ISO-8859-1.
Zde je testovací úryvek, který to dokazuje:
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);
}
Které tiskne
\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0
Váš problém tedy musí být vyřešen o krok dříve. Protože mluvíte o webové aplikaci Java a tento řetězec je pravděpodobně výsledkem vstupu uživatele, jste si jisti, že jste se postarali o kódování požadavků a odpovědí HTTP? Nejprve v JSP musíte na začátek JSP přidat následující:
<%@ page pageEncoding="UTF-8" %>
To nejen vykreslí stránku v UTF-8, ale také implicitně nastaví HTTP Content-Type
hlavička odpovědi instruující klienta, že stránka je vykreslena pomocí UTF-8, takže klient ví, že by měl zobrazovat jakýkoli obsah a zpracovávat všechny formuláře pomocí stejného kódování.
Nyní, část požadavku HTTP, pro požadavky GET musíte nakonfigurovat příslušný servletcontainer. Například v Tomcatu jde o nastavení URIEncoding
atribut konektor HTTP
v /conf/server.xml
podle toho. U požadavků POST by to již mělo být zajištěno tím, že klient (webový prohlížeč) je dostatečně chytrý, aby použil kódování odpovědi, jak je uvedeno v JSP. Pokud ne, budete muset zavést Filter
které kontroluje a sady
kódování požadavku.
Další informace o pozadí najdete tento článek užitečné.
Kromě toho všeho má MySQL další problém se znaky Unicode. Podporuje pouze znaky UTF-8 až 3 bajty , ne 4 bajty. Jinými slovy, podporován je pouze rozsah BMP 65535 znaků, mimo ne. Plně to podporuje například PostgreSQL. To nemusí poškodit vaši webovou aplikaci, ale určitě je to něco, co je třeba mít na paměti.