14. august 2001 - 09:49Der er
13 kommentarer og 1 løsning
Æ,ø og å i Java.
Jeg har efterhånden stødt på nogen iriterende problemer med Javas behandling af æ, ø og å. Hvis man f.eks skriver: System.out.println(\"Lærke\"); bliver det i en dos-prompt udskrevet som L?rke (?=my men jeg kunne ikke skrive my i indlægget).
I et andet tilfælde har jeg lagt navnet Lærke ind i en MySQL database [1, Lærke] via MySQL’s egen dos-baserede kommando promt. Når det gennem JDBC (resultSet.getString(2);) hentes ud igen til den Dos-prompt hvor jeg kører javaprogammet, bliver det skrevet rigtigt nok. Hvis jeg derimod søger efter ’æ’ i den levereder streng med: streng.indexOf(\'æ\'); kan Java ikke finde bogstavet. Der ledes efter ’my’.
Er der nogen der har en ide til at komme ud af forviklingerne ?
i = s.indexOf(\"&\"); if (i > -1) { j = s.indexOf(\";\"); if (j > i) { // ok this is not most optimized way to // do it, a StringBuffer would be better, // this is left as an exercise to the reader! String temp = s.substring(i , j + 1); // search in escape[][] if temp is there k = 0; while (k < escape.length) { if (escape[k][0].equals(temp)) break; else k++; } if (k < escape.length) { s = s.substring(0 , i) + escape[k][1] + s.substring(j + 1); return unescapeHTML(s); // recursive call } } } return s; } }
Hvis jeg husker rigtigt, er det et problem med Command Prompten som ikke er glad for æøå.
Forresten er det en dumt ting at bruge kolonne nummeret til at hente fra et ResultSet, brug hellere kolonne navnet. For ellers fucker dit program totalt up, hvis der bliver lavet om på din tabel.
Selvom alexbp\'s forslag ikke kunne bruges \'gafler\' jeg det aligevel. Men jeg vil lige minde om at jeg jo netop ikke kunne søge efter f.eks \'æ\' i en String. Det går fint nok med f.eks \'c\' eller \'h\', men æ,ø og å finder den ikke.
Java arbejder internt med 16-bit unicode (Har vi hørt!), men skal selvfølgelig konverteres frem og tilbage til platforme, der ikke anvender 16-bit unicode.
afhængig af hvor du efterfølgende vil have resultatet henaf, skal det konverteres derefter. Hvis du f.eks. vil have det ud i en dos prompt, skal du selvfølgelig bruge det tegnsæt, der hører sig til der (Mode Con kommandoen vil fortælle hvilken code page du anvender, standard er vist 850).
Her er en eksempel på konvertering mellem unicode og 850:
public void println(String s) throws UnsupportedEncodingException { String converted = new String(s.getBytes(\"CP850\")); System.out.println(converted); }
CP850 er ikke supporteret direkte i rt.jar, men kræver at du har i18n.jar i brug også. Det er vist nok standard idag (ihvertfald j2se1.3). Til almindelige filer i windows anbefales cp1252, som er windows\' udvidede latin-1 karakterset.
Listen over tegnsæt ligger iøvrigt her under java docs biblioteket:
docs\\guide\\intl\\encoding.doc.html
Kig også på opsætningen af mysql. mht til databaser kan du vælge en af følgende ting: 1 Lave databasens tegnsæt om til unicode 2 Lade javaklasserne konveretere mellem unicode og db tegnsæt 3 Ignorere problemet.
Den sidste kan se lidt barsk ud, men hvis det kun er java, der læser og skriver til DB bliver karakterene korrekt i den sidste ende.
Jeg takker for bidragende og giver pointene til ’logical’, for han meget gennemarbejde svar, og fordi hans sidste forslag viste sig at være løsningen på mit problem. Mvh orthanc
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.