Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Java Encoding Problem

Empfohlene Antworten

Hallo,

ich versuche einen String mit Umlauten aus UTF-8 (im Beispiel cp1252, wegen Windows Einstellung) nach IBM850 umzuwandeln. Das geht auch, bis auf das kleine ü.

Hier mal ein Beispiel damit man das Problem nachvollziehen kann:


	public static void main(String[] args) throws UnsupportedEncodingException, CharacterCodingException {

		//*** String test soll neu kodiert werden

		String test = "aou - äöü";

		//*** zuerst der ganz einfache Weg, ein neuer String mit Encoding

		String enc = new String(test.getBytes("cp1252"), "IBM850");

		//*** String ausgeben

		System.out.println("enc: " + enc);

		//*** Hier noch die ausgabe der einzelnen Byte-Werte der Characters

		for ( int i = 0; i < enc.length(); i++) {

			  System.out.print((int)enc.charAt(i) + " - ");

		}

		System.out.println("");


		//*** Jetzt etwas komplizierter über einen CharsetEncoder

		CharsetEncoder csEnc = Charset.forName("IBM850").newEncoder();

		//*** Umwandeln in einen ByteBuffer

		ByteBuffer bbuf = csEnc.encode(CharBuffer.wrap(test));

		//*** ByteBuffer in einen String umwandeln und ausgeben

		String s = new String(bbuf.array(), 0, bbuf.limit());

		System.out.println("s: " + s);

		//*** Ausgabe der Byte-Werte

		for ( int ix = 0; ix < enc.length(); ix++) {

			//*** Umwandeln von signed Byte zu unsigned Byte (standard Byte(Buffer) = -128 bis 127)

			int i = bbuf.array()[ix] >= 0 ? bbuf.array()[ix] : 256 + bbuf.array()[ix];

			System.out.print( i + " - ");

		}

		System.out.println("");

		//*** Nochmal Ausgabe mit String-Encoding

		String newS = new String(bbuf.array(), 0, bbuf.limit(), "IBM850");

		System.out.println("newS: " + newS);


	}

Die Ausgabe ist folgende:

enc: aou - õ÷³

97 - 111 - 117 - 32 - 45 - 32 - 245 - 247 - 179 - 

s: aou - „”?

97 - 111 - 117 - 32 - 45 - 32 - 132 - 148 - 129 - 

newS: aou - äöü

Der erste String sieht ja ok aus, ist er aber nicht. Laut

IBM850 Charset Encoder Test

muss für ü 129 (0x0081) rauskommen. Auch eine weitere Tabelle von IBM850 bestätigt mir das (auf Papier).

Der zweite String ist ok, alles stimmt, bis auf das ü. Die Werte der einzelnen Buchstaben sind korrekt.

Der dritte ist wiederum sehr komisch, denn er ist ja wieder der Ausgangsstring (wieder zurückkonvertiert?)

Die 129 ist ja soweit ok, nur wenn es ausgegeben wird, auch in einen OutputStream in eine Datei (mit passendem Encoding), steht ein ? (0x003f) da. Also einen Wert den er meint nicht umwandeln zu können.

Hat da jemand eine Idee?

Bearbeitet von JesterDay

Also, da der Char Wert ja ansich stimmt, haben wir probiert den einfach direkt zu schreiben, nicht über den String-Umweg. Damit geht es...

Werd das morgen entsprechend umbauen.

Nur mal zur Info.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Konto

Navigation

Suchen

Suchen

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.