String.getBytes(charset) fehlerhaft für EBCDIC-charset

Die String-Konvertierung nach EBCDIC über die String.getBytes(charset) ist fehlerhaft. Dabei wird „a“ falsch nach 0x3f konvertiert, es sollte aber 0x81 sein.

...
	public static void  convert() throws UnsupportedEncodingException {
		String data="abcABC";
		String ebcdic = "IBM-1047";
		String ascii  = "ISO-8859-1";
		
		System.out.printf("Charset %s is supported: %s
", ebcdic, Charset.isSupported(ebcdic));
		String result= new String(data.getBytes(ebcdic));
		System.out.printf("EBCDIC: %s
",asHex(result.getBytes()));
		
		System.out.printf("Charset %s is supported: %s
", ascii, Charset.isSupported(ascii));
		result= new String(data.getBytes(ascii));
		System.out.printf("ASCII: %s
",asHex(result.getBytes())); 
	}

	public static String asHex(byte[] buf) {
        char[] HEX_CHARS = "0123456789abcdef".toCharArray();
        char[] chars = new char[2 * buf.length];
		for (int i = 0; i < buf.length; ++i)
		{
			chars[2 * i] = HEX_CHARS[(buf** & 0xF0) >>> 4];
			chars[2 * i + 1] = HEX_CHARS[buf** & 0x0F];
		}
		return new String(chars);
	}

Als Ergebnis bekomme ich:

Charset IBM-1047 is supported: true
EBCDIC: 3f8283c1c2c3
Charset ISO-8859-1 is supported: true
ASCII: 616263414243

Ich bin auf der Suche nach einer Lösung, bevor ich anfange mir eine eigene Konvertierungsroutine zu basteln.

Was mach Java bei:


 chars[2 * i] = HEX_CHARS[(buf** & 0xF0)[U]>>> 4[/U] ];

[QUOTE=MZ80A]Was mach Java bei:


 chars[2 * i] = HEX_CHARS[(buf** & 0xF0)[U]>>> 4[/U] ];

[/QUOTE]

Die Hex-Darstellung ist richtig, Mir ist das Problem aufgefallen beim “write(byte[], offset, len” des EBCDIC-Strings. Das Program hier dient nur dazu das Problem anschaulich zu machen. Die Routine asHex zeigt also nur den Fehler; wird aber sonst nicht benötigt.

Habe den Fehler gefunden. Mit

String result= new String(data.getBytes(ebcdic));

erzeuge ich wieder einen String und Java speichert das wieder intern in UTF8 ab.
Wenn ich das nach

byte[] result= data.getBytes(ebcdic);

ändere wird alles gut.

Falls du es als String benötigst könntest du auch den Charset-Konstruktor von der String-Klasse verwenden.

Gruß

[QUOTE=Firephoenix]Falls du es als String benötigst könntest du auch den Charset-Konstruktor von der String-Klasse verwenden.

Gruß[/QUOTE]
Danke für den Hinweis, für mein Anliegen ist es so ok.