В UTF-8, Упячка
всъщност трябва да се представи като \x423\x43F\x44F\x447\x43A\x430
. \xD0\xA3\xD0\xBF\xD1\x8F...
означава, че те са неправилно кодирани с помощта на ISO-8859-1.
Ето един тестов фрагмент, който доказва това:
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);
}
Което отпечатва
\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0
Така че вашият проблем трябва да бъде решен една стъпка преди това. Тъй като говорите за уеб приложение на Java и този низ вероятно е резултат от потребителско въвеждане, сигурни ли сте, че сте се погрижили за кодирането на HTTP заявката и отговора? Първо, в JSP трябва да добавите следното в началото на JSP:
<%@ page pageEncoding="UTF-8" %>
Това не само изобразява страницата в UTF-8, но също така имплицитно задава HTTP Content-Type
заглавка на отговора, която инструктира клиента, че страницата е изобразена с UTF-8, така че клиентът да знае, че трябва да показва всяко съдържание и да обработва всякакви формуляри, използвайки същото кодиране.
Сега, частта за HTTP заявка, за GET заявки трябва да конфигурирате въпросния сервлетконтейнер. В Tomcat например това е въпрос на настройка на URIEncoding
атрибут на HTTP конектор
в /conf/server.xml
съответно. За POST заявки това вече трябва да се погрижи от клиента (уеб браузъра), който е достатъчно умен, за да използва кодирането на отговора, както е посочено в JSP. Ако не стане, тогава ще трябва да въведете Filter
който проверява и комплекти
кодирането на заявката.
За повече основна информация можете да намерите тази статия полезно.
Освен всичко това, MySQL има друг проблем с Unicode знаците. Поддържа само UTF-8 знаци до 3 байта , а не 4 байта. С други думи, само BMP диапазонът от 65 535 знака се поддържа, извън него не. PostgreSQL например го поддържа напълно. Това може да не навреди на вашето уеб приложение, но със сигурност е нещо, което трябва да имате предвид.