I UTF-8, Упячка
skal faktisk repræsenteres som \x423\x43F\x44F\x447\x43A\x430
. \xD0\xA3\xD0\xBF\xD1\x8F...
betyder, at de er kodet forkert ved hjælp af ISO-8859-1.
Her er et testuddrag, der beviser dette:
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);
}
Hvilke udskrifter
\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0
Så dit problem skal løses et skridt før. Da du taler om en Java-webapplikation, og denne streng sandsynligvis er et resultat af brugerinput, er du sikker på, at du har passet på HTTP-anmodnings- og svarkodningerne? Først i JSP skal du tilføje følgende til toppen af JSP:
<%@ page pageEncoding="UTF-8" %>
Dette gengiver ikke kun siden i UTF-8, men det sætter også implicit en HTTP Content-Type
svarhoved, der instruerer klienten om, at siden gengives ved hjælp af UTF-8, så klienten ved, at den skal vise ethvert indhold og behandle alle formularer ved hjælp af den samme kodning.
Nu, HTTP-anmodningsdelen, for GET-anmodninger skal du konfigurere den pågældende servletcontainer. I Tomcat for eksempel er dette et spørgsmål om at indstille URIEncoding
attribut for HTTP-stikket
i /conf/server.xml
derfor. For POST-anmodninger bør dette allerede passes af, at klienten (webbrowseren) er smart nok til at bruge svarkodningen som angivet i JSP'en. Hvis det ikke gør det, skal du indsætte et Filter
som tjekker og sæt
anmodningskodningen.
For mere baggrundsinformation kan du finde denne artikel nyttigt.
Ud over alt dette har MySQL et andet problem med Unicode-tegn. Det understøtter kun UTF-8-tegn op til 3 bytes , ikke 4 bytes. Med andre ord er det kun BMP-intervallet på 65535 tegn, der understøttes, udenfor ikke. PostgreSQL understøtter det for eksempel fuldt ud. Dette skader muligvis ikke din webapplikation, men dette er bestemt noget, du skal huske på.