I UTF-8, Упячка
ska faktiskt representeras som \x423\x43F\x44F\x447\x43A\x430
. \xD0\xA3\xD0\xBF\xD1\x8F...
innebär att de är felaktigt kodade med ISO-8859-1.
Här är ett testutdrag som bevisar detta:
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);
}
Vilka skriver ut
\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0
Så ditt problem måste lösas ett steg innan. Eftersom du talar om en Java-webbapplikation och den här strängen troligen är resultatet av användarinmatning, är du säker på att du har tagit hand om HTTP-förfrågan och svarskodningar? Först, i JSP, måste du lägga till följande till toppen av JSP:
<%@ page pageEncoding="UTF-8" %>
Detta återger inte bara sidan i UTF-8, utan ställer också implicit in en HTTP Content-Type
svarshuvud som instruerar klienten att sidan renderas med UTF-8, så att klienten vet att den ska visa allt innehåll och bearbeta alla formulär med samma kodning.
Nu, HTTP-förfrågningsdelen, för GET-förfrågningar måste du konfigurera servletcontainern i fråga. I Tomcat till exempel handlar det om att ställa in URIEncoding
attribut för HTTP-anslutningen
i /conf/server.xml
följaktligen. För POST-förfrågningar bör detta redan tas om hand genom att klienten (webbläsaren) är smart nog att använda svarskodningen som specificeras i JSP. Om det inte gör det måste du ta in ett Filter
som kontrollerar och set
förfrågningskodningen.
För mer bakgrundsinformation kan du hitta denna artikel användbar.
Förutom allt detta har MySQL ett annat problem med Unicode-tecken. Den stöder endast UTF-8-tecken upp till 3 byte , inte 4 byte. Med andra ord, endast BMP-intervallet på 65535 tecken stöds, utanför inte. PostgreSQL till exempel stöder det fullt ut. Detta kanske inte skadar din webbapplikation, men detta är verkligen något att tänka på.