Charset dekodieren

Flo<H>

Erfahrenes Mitglied
Hallo!
Ich programmiere zur Zeit ein kleines Programm, welches mir von Mp3s die ID3Tags ausliest und mir diese anzeigt. Nun habe ich das Problem, dass ID3v2 Tags verschiedene Charsets unterstützen und verwenden. Deshalb muss ich zuerst den richtigen Zeichensatz herausfinden und anschließend die Zeichen dekodieren:

Code:
private String convertString(String str, long cs)
{
     String charSet = "ISO-8859-1";
     switch((int)cs)
     {
          case 1: charSet = "UTF-8";   break;
	  case 2: charSet = "UTF-16BE"; break;
	  case 3: charSet = "UTF-16";    break;
     }
     CharsetDecoder decoder = Charset.forName(charSet).newDecoder();
     try 
     {
          CharBuffer cbuf = decoder.decode(ByteBuffer.wrap(str.getBytes()));
	  return cbuf.toString();
     }
     catch (CharacterCodingException e) 
     {
          System.err.println("Decoder error");
     }
     return "";
}

Das funktioniert bei dem Großteil der Mp3s. Nur wenn ich mit UTF-8 dekodieren muss bekomme ich Fehler. Die Strings haben dann am Anfang immer zwei Rechtecke, dann kommt der erste Buchstabe, dann wieder ein Rechteck, dann der nächste Buchstabe und immer so weiter:
[][]D[]i[]e[]s[] []i[]s[]t[] []e[]i[]n[]e[] []D[]a[]t[]e[]i[]
wobei [] ein Rechteck darstellen soll.

Zudem hab ich grad gesehen, dass bei der ISO Dekodierung die ü,ö,ä falsch dargestellt werden.

Hat jemand für mich einen Denkanstoß was ich da ändern könnte?

flo
 
Hi,

also Java zeigt innerhalb der GUI sowie in der Windows-Cmd keine Umlaute korrekt an,
wenn der vorliegende Zeichensatz nicht UTF-8 ist.

Kannst aber für die Files folgendes machen: setze den ID3-String mit
String s = new String(oldString.getBytes("UTF-8"), "ISO-8859-1");

Für die Anzeige innerhalb der GUI machst du eben UTF-8 draus, so dass
die Files korrekt angezeicht werden. Was noch geht: fast jedes GUI-Element
(JList, JTable, JLabel 100%ig) hat eine Methode zur default-Locale:
JLabel label = new JLabel("Können");
label.setLocale(Locale.GERMANY);

das setzt das Label bei jedem Aufruf (Painting) auf ISO-8859-1

LG
Andy
 
Zurück