Zeichensatz von einem String ändern

Flo<H>

Erfahrenes Mitglied
Hallo!
Ich hab (mal wieder) ein Problem mit den Zeichensätzen:
Ich hab ein kleines Programm, dass aus einer MP3 mit Hilfe der jaudiotagger-Lib den Inhalt der ID3v2Tags ausliest. Anhand eines gespeicherten Bytes wird der Zeichensatz des ausgelesenen Strings bestimmt und umgewandelt, damit er fehlerfrei dargestellt wird.

Nun will ich aber z.B. den Titel der MP3 ändern und wieder im Tag speichern. Will ich den String in ISO-8859-1 speichern funktioniert dies auch wunderbar, aber da ID3v2 auch noch UTF unterstützt muss ich den String irgendwie umwandeln können.

Mein bisheriger Ansatz war einen CharsetEncoder zu benützen:
Java:
// text enthält den String der geändert werden soll
// charset.toString() liefert den String in den umgewandelt werden soll
CharsetEncoder encoder = Charset.forName(charset.toString()).newEncoder();
try
{
     ByteBuffer byteBuffer = encoder.encode(CharBuffer.wrap(text));
}
catch(Exception ex)
{ ...}
Vielleicht lieg ich ja jetz auch total falsch, aber es müsste doch jetzt in byteBuffer der umgewandelte String vorliegen. Nur wenn ich dieses jetzt irgendwie als String speichern will wird nicht in dem gewünschten Zeichensatz gespeichert.

mfg flo
 
Hallo,

Java:
"abcd€".getBytes("UTF-8")
Wenn du in Java einen String in einem anderen Encoding haben möchtest kannst du dir beispielsweise die Encoding-Spezifische byte[] repräsentation holen und diese dann in die Datei schreiben.

Gruß Tom
 
So, irgendwas versteh ich hier nicht so ganz. Mittlerweile bin ich soweit dass es Mit ISO-8859-1 und UTF-8 funktioniert, nur die UTF-16 Zeichensätze wollen noch nicht.
Hab mir jetz ein kleines Testprogramm geschrieben und bin mittlerweile der Meinung dass ich einen totalen Denkfehler hab:

Java:
import java.nio.charset.*;

public class Charsets
{
	public static void main(String[] args)
	{
		System.out.println("Default charset: " + Charset.defaultCharset());
		String testString = "Hello World";
		System.out.println("testString: " + testString);
	
		try
		{
			String utf = new String(testString.getBytes(Charset.defaultCharset()), "UTF-16LE");
			System.out.println("utf: " + utf);
			String original = new String(testString.getBytes("UTF-16LE"), Charset.defaultCharset());
			System.out.println("original: " + original);
		}
		catch(Exception ex)
		{
			System.out.println("Exception");
		}
	}
}
Als Ausgabe hatte ich erwartet:
Code:
Default charset: UTF-8
testString: Hello World
utf: ??????
original: Hello World

Erhalten habe ich aber folgendes:
Code:
Default charset: UTF-8
testString: Hello World
utf: ??????
original: H
Kann mir dazu jemand die Ursache erklären? Dass der UTF-16 String nicht richtig angezeigt wird ist klar, nur warum geht da soviel verloren?
Bzw. wie kann ich es so ändern, dass am Schluss wieder den original String hab?
mfg flo
 
Irgendwie bin ich da gestern wohl doch zu lange davor gesessen.
Die Lösung von Thomas funktioniert jetzt auf alle Fälle.
Also viele Dank!
mfg flo
 
Hallo,

evtl. kann mir auch jemand helfen. Ich habe Strings im HTML-Code und möchte diese in ein lesbares Format (oder irgendeins, mit dem ich weiterarbeiten kann) dekodieren.

Also z.B. &aring; in å oder &ouml; in ö.

Gibt es da irgendwelche Bordmittel in Java oder anderweitige Wege, ohne jedes Zeichen "zu Fuß" dekodieren zu müssen?

Gruß Tweedledee
 
Wenn ich mich hier mal dranhängen darf:
Ich bekomme an ein Servlet Nachrichten übermittelt, die ich über Hibernate persistieren will.
Es gibt jetzt allerdings häufig ein Problem in folgender Art:
Code:
2008-03-07 09:18:01,849 ERROR org.hibernate.util.JDBCExceptionReporter - FEHLER: Zeichen 0xc2a4 in Kodierung »UTF8« hat keine Entsprechung in »LATIN9«

Im Moment übernehme ich einfach den erhaltenen String. Da es laut Fehlermeldung ja kein Äquivalent zu diesem Char in LATIN9 gibt, nehme ich an dass der Vorschlag von oben (getBytes(CHARSET)) ebenfalls fehlschlagen würde.

Wie kann ich das Problem beheben?

Danke!
 
Zurück