[java] JEditorPane getText exception: RTF is an 8-bit format

Pagina: 1
Acties:
  • 162 views sinds 30-01-2008
  • Reageer

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 17-04 12:40
Ik ben enorm aan het stoeien met een JEditorPane icm een RTFEditorKit

Constructor:
Java:
1
2
3
4
5
6
7
8
9
10
11
public LPAEditorPane()
{
    super();
    setEditorKit(new RTFEditorKit());
    addBindings();
    StyledDocument document = (StyledDocument) getEditorKit().createDefaultDocument();
    Style style = document.getLogicalStyle(0);
    StyleConstants.setFontSize(style, 10);
    StyleConstants.setFontFamily(style, "Verdana");
    setDocument(document);
}


addBindings is niets meer dan Ctrl-B binde aan bold enzo

Het initialiseren gaat allemaal prima, maar wanneer ik de settext overrride om te zien wat er allemaal gebeurt met
Java:
1
2
3
4
5
6
public void setText(String t)
{
    System.out.println("setText:" + t);
    super.setText(t);
    System.out.println("getText:" + getText());
}

dan krijg ik eerste en rtf string te zien met alle formatting, en daarna print hij null :S.

Bij het debuggen krijg ik een exception bij de getText method, maar java is zo fijn om niet te printen wat er fout gaat, dus heb de getText van de JEditorPane overnomen en de IOException geprint.
De message is RTF is an 8-bit format.

De RTF die ik wil laten zien komt oorspronkelijk uit een .NET programma wat ik heb geexporteerd naar text files en weer geimporteerd in java. Misschien staan er characters in die niet worden ondersteund? Ik zit echt vast hier! iemand met de zelfde ervaring?

  • Lethalis
  • Registratie: April 2002
  • Niet online
Bij het exporteren van een .NET programma kun je - als ik het mij goed herinner - de encoding meegeven (UTF-8, UTF-16, etc). Waarschijnlijk heb je een encoding gebruikt die jouw JAVA applicatie niet lust :)

Ask yourself if you are happy and then you cease to be.


  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Hoe gaat het als je de tekst niet met setText in de textcomponent plaatst, maar met read?
Java:
1
RTFEditorKit.read(InputStream in, Document doc, int pos)

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 17-04 12:40
zwippie schreef op maandag 28 november 2005 @ 14:47:
Hoe gaat het als je de tekst niet met setText in de textcomponent plaatst, maar met read?
Java:
1
RTFEditorKit.read(InputStream in, Document doc, int pos)
Dit gebeurt ook onderhuids in de jtextpane.

in .NET gebruik ik streamWriter.CreateText() om text bestanden te maken. Dit gebruikt UTF-8 als encoding.

Bij het inlezen van de text files in java gebruik ik
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
private String convertToUnicode(String text)
{
    try
    {
        String s = new String(text.getBytes("UTF-8"), "UTF-8");
        return s;
    }
    catch (UnsupportedEncodingException e)
    {
        e.printStackTrace();
    }
    return null;
}

Waarbij ik denk dat text UTF-8 is.

Hiermee is het probleem niet opgelost helaas. Hoe kan ik controleren welke encoding een string heeft?

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 17-04 12:40
We komen al een stukje verder. De bron bestanden zijn geëncode in Cp1252. Nu nog een manier vinden om te naar unicode om te zetten (tonnen informatie over encodings maar geen simpel convert scriptje..)

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Reactie op je vorige vraag:

Je kunt de encoding van de inputfile opvragen met InputStreamReader.getEncoding(), maar de encoding van de file weet je intussen dus al.

Hoe je de encoding van een String opvraagt weet ik niet. Wel zeggen de API docs:
A String represents a string in the UTF-16 format in which supplementary characters are represented by surrogate pairs.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 17-04 12:40
Ik weet idd dat de encoding UTF-8 / Cp1252 is, maar als zodra ik dat in een string zet, wordt dat dan automatisch omgezet naar UTF-16 of moet ik dat zelf doen door new String(text.getBytes("Cp1252"),"UTF-16) te doen.

Beide gevallen geven nog steeds dezelfde fout :(

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 17-04 12:40
Ik vind swing maar een rare jongen en ik hoop vurig dat ze in de volgende versie de text componenten flink gaan verbeteren!

Met behoorlijk veel gepruts heb ik een voor mij werkende oplossing gevonden aan dit ellendig probleem:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public String getText()
    {
        RTFEditorKit editorKit = (RTFEditorKit) getEditorKit();
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        String text = null;
        try
        {
            editorKit
                    .write(stream, getDocument(), 0, getDocument().getLength());
            text = new String(stream.toByteArray());
            stream.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (BadLocationException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                stream.close();
            }
            catch (IOException e)
            {}
        }
        return text;
    }


Voor de mensen die dus ook met encoding problemen zitten is dit dus de oplossing..
Pagina: 1