Permalänk
Medlem

Java: Specialtecken

Hej!

Försöker koda en app till android och har stött på ett grymt irriterande problem. Jag hämtar ner en HTML fil rad för rad och lägger ut i en tabell. Nu är det så att sidan är gjord på svenska och därför blir det lite knas med åäö. Jag vet att kodningen på sidan är windows-1252 (eller CP-1252) men nu vill jag ha ut den så att tecknena visas rätt i appen. För tillfället visas bara ?? där dessa ska vara.

Jag har testat med etta men får bara error så fort det är å, ä eller ö...

public String changeCharset (String input) { // Create the encoder and decoder for ISO-8859-1 Charset charset = Charset.forName("windows-1252"); CharsetDecoder decoder = charset.newDecoder(); CharsetEncoder encoder = charset.newEncoder(); try { // Convert a string to ISO-LATIN-1 bytes in a ByteBuffer // The new ByteBuffer is ready to be read. ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(input)); // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string. // The new ByteBuffer is ready to be read. CharBuffer cbuf = decoder.decode(bbuf); return cbuf.toString(); } catch (CharacterCodingException e) { System.out.println(e); return ""; } }

Tacksam för hjälp!
Loffa

Permalänk
Medlem

Har aldrig hållit på med charset conversions i Java men skulle gissa på att du bör göra följande:

Läs in input till en ByteBuffer, decode till CharBuffer, konvertera till String.

Visa signatur

Assembly är ett högnivåspråk.

Permalänk
Medlem

Det är ju det jag gör men ändå så får jag error...

Permalänk
Medlem
Skrivet av loffa116:

Det är ju det jag gör men ändå så får jag error...

Nej, du anropar ju encode().

Visa signatur

Assembly är ett högnivåspråk.

Permalänk
Medlem

(nu har jag iofs inte hållit på med java på ett bra tag (och då i begränsad mängd), så ta mitt svar med en näve salt.)

string i Java är, så vitt jag minns, alltid en samling av unicode-tecken.
detta (om mitt minne nu stämmer) gör att din funktion får in en unicode-sträng (inklusive konstiga tecken) som encodas om till windows-1252 och sedan decodas denna till unicode igen. ett arbete som är helt bortkastat.
vad du behöver göra är att, som Gramner skriver (om än lite kortfattat), köra decode redan på webserverns ByteStream (eller vad det nu kan tänkas vara man får).
dvs något i stil med detta:

Charset.forName("windows-1252").decode(webServernsByteStream).toString();

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Vad använder du för kod för att läsa HTML-sidans rader som strängar? Där borde du kunna välja vilket charset som ska användas, så att det blir rätt direkt.

Exempelvis:

ArrayList<String> lines = new ArrayList<String>(); try { URL url = new URL("http://www.dn.se/"); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); InputStream is = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); while (true) { String line = br.readLine(); if (line == null) break; lines.add(line); } } catch (IOException e) { }

Permalänk
Medlem
Skrivet av VirtualIntent:

Vad använder du för kod för att läsa HTML-sidans rader som strängar? Där borde du kunna välja vilket charset som ska användas, så att det blir rätt direkt.

Exempelvis:

ArrayList<String> lines = new ArrayList<String>(); try { URL url = new URL("http://www.dn.se/"); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); InputStream is = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); while (true) { String line = br.readLine(); if (line == null) break; lines.add(line); } } catch (IOException e) { }

SMART!
Hade inte ens tänkt på det, ska kolla om det funkar nu...

EDIT: Det fungerade, tack så mycket!!