Zeichensatzkonvertierung von Zeilenumbrüchen

StefanG

Aktives Mitglied
Hallo,

ich erhalte aus einer Datenbank Abfrage einen E-Mail Text der in einer Datei (Zeichen HTML kompatibel) abgespeichert werden soll.

Das Problem ist, das Zeilenumbrüche mit einem Quadrat dargestellt sind, sprich der Zeichensatz nicht verarbeitet werden konnte.

Hat jemand eine Lösung wie ich die Zeilenumbrüche in meinem String durch

Code:
& # 1 3 ; & # 1 0 ;

(ASCII Code)

ersetzen kann?
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Du musst schon genau wissen was jetzt drin steht! Was sind es denn für Zeichen?

Dann kannst du diese Zeichen durch die von dir gewünschten ersetzen.

Aber etwas unbekanntes lässt sich sehr schwer ersetzen ;-)
 

StefanG

Aktives Mitglied
Habe mir die ausgegebene Datei mit einem Hex-Editor angesehen und stelle zwei Varianten für Zeilenumbrüche fest:

0D0A & 0A

diese möchte ich nun durch & # 1 3 ; & # 10 ; ersetzen.

Java:
sText = sText.replaceAll("0A", "0D0A");
sText = sText.replaceAll("0D0A","& # 1 3 ; & # 1 0 ;"); 

// Bitte leerzeichen wegdenken, wird sonst nicht angezeigt!

So funktioniert es leider nicht!
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Dann ersetze 0D0A durch den von dir gewünschten String - ist etwas schwierig weil der Ersatz länger ist als das zu ersetzende Muster

Sie z.B. hier und noch an vielen anderen Stellen ;-) Das Thema ist nicht neu ...


oder erst 0D0A durch %s ersetzen (ist gleich lang) und dann mit String.format bei %s deinen String rein"basteln" ....

oder oder oder ...

Versuch mal etwas, dann sehen wir weiter
 

StefanG

Aktives Mitglied
Das Problem ist nicht das ersetzen, sondern das finden der Zeilenumbrüche. Muss ich den String erst in ein ByteArray packen?

Ich kann das ersetzen doch nur auf Byte Ebene machen, oder?
 

Andi_CH

Top Contributor
EDIT: Man (ich!) sollte endlich gemerkt haben, dass man nicht über eine Stunde lang tippen sollte ohne nachzusehen ob schon längst jemand die Antwort gegeben hab;-)
Also löschen und verkürzen ........


So nur noch die (schon oben gegeben Lösung) noch mit einigem Schnickschnack.

Was ist eigentlich der Unterschied ob in diesem konkreten Fall replace oder replaceAll verwendet wird?

Java:
package com.javaforum.stringmanipulationen;

public class Repalce0A0D {
	
	private static String zeile = "12345" + (char)10 + (char)13 + "6789";
	private static String suchmuster = "" + (char)10 + (char)13;
	private static String ersatz = "
";

	public static void main(String[] args) {
		System.out.println("Zeile = " + zeile);
		System.out.println("Contains = " + zeile.contains(suchmuster));
		System.out.println("Position = " + zeile.indexOf(suchmuster));
		zeile = zeile.replace(suchmuster, ersatz);
		System.out.println(zeile);
		String.format(zeile, ersatz);
	}
}

Output: (Letzte Zeile mit " " versehen sondt wird die nicht richtig angezeigt!)
Code:
Zeile = 12345

6789
true
Position = 5
1 2 3 4 5 & # 1 3 ; \ & # 1 0 ; 6 7 8 9
 
Zuletzt bearbeitet:

StefanG

Aktives Mitglied
Danke erstmal für deinen Lösungsansatz!

Jedoch funktioniert dieser mit meinem String nicht. Er findet die zu ersetzenden Zeichen nicht....
 

VfL_Freak

Top Contributor
Moin,

bin mir zwar nicht sicher, ob ich das alles hier verstanden habe ... :D

Aber Du könntest entweder mit 0xa/0xd versuchen oder besser gleich mit "\r" und "\n" :
Java:
private static String zeile = "12345" + 0x0A + 0x0D + "6789";

// oder eben direkter
private static String zeile = "12345\r\n6789";

Gruß
Klaus
 

Andi_CH

Top Contributor
Jedoch funktioniert dieser mit meinem String nicht. Er findet die zu ersetzenden Zeichen nicht....

Dann stehen sie so nicht drin oder du machst den Fehler den neue generirten Text nicht zu speichern (unten erläutert)!

Im String
Java:
private static String zeile = "12345" + (char)10 + (char)13 + "6789";
findet "er" es (wer auch immer "er" ist) ;-)

und 0X0A ist nichts anderes als (char)10 ....

Also: es herrschen berechtigte Zweifel daran was wirklich in deinen Strings steht.

Gib doch bitte einfach mal eine deiner Zeilen aus und zwar etwa so wie in print().

Java:
	private static String zeile = "12345" + (char)10 + (char)13 + "6789";

	public static void print(String str) {
		for(int i=0; i<str.length(); i++) {
			System.out.print((byte)str.charAt(i) + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		System.out.println("Zeile = " + zeile);
		System.out.print("zeile = ");
		print(zeile);
	}

Output:
Code:
Zeile = 12345

6789
zeile = 49 50 51 52 53 10 13 54 55 56 57


Noch etwas was ich in einema anderen Thread gelesen habe:

replace und replaceAll verändern nicht den Originaltext!
(Ach ja: was ist denn nun der Unterschied??)

also
Java:
zeile.replace(suchmuster, ersatz);
bewirkt rein gar nichts!

es muss
Java:
zeile = zeile.replace(suchmuster, ersatz);
heissen.

EDIT: Ich habe gerade nachgelesen, dass du auch 0A ohne 0D festgestellt hast -
also ersetze zuerst 13 10 durch den html-String, dann (im Resultat von vorhin) 10 13 ersetzen und dann noch 10 ersetzen.

Oder:

10 ersetzen und im zweiten Schritt alle 13 rausschmeissen.
So solltest du alles erwischen.
 
Zuletzt bearbeitet:

StefanG

Aktives Mitglied
Hier mal eine Beispiel Datei, vielleicht wird das Problem dann klarer. Umlaute sind bereits korrigiert!

Zu dem vorherigen Post:

Java:
// E-Mail Text vor Übergabe an *.params Datei korrigieren
		this.sParamsText = this.sParamsText.replaceAll("Ä", "& # 1 9 6 ;"); // Ä
		this.sParamsText = this.sParamsText.replaceAll("ä", "& # 2 2 8 ;"); // ä
		this.sParamsText = this.sParamsText.replaceAll("Ü", "& # 2 2 0 ;"); // Ü
		this.sParamsText = this.sParamsText.replaceAll("ü", "& # 2 5 2 ;"); // ü
		this.sParamsText = this.sParamsText.replaceAll("Ö", "& # 2 1 4 ;"); // Ö
		this.sParamsText = this.sParamsText.replaceAll("ö", "& # 2 4 6 ;"); // ö
		this.sParamsText = this.sParamsText.replaceAll("ß", "& # 2 2 3 ;"); // ß

Das funktioniert bereits, den Fehler mit dem nicht abspeichern, habe ich nicht gemacht.
 

Anhänge

  • Beispiel.zip
    241 Bytes · Aufrufe: 2
Zuletzt bearbeitet:

Andi_CH

Top Contributor
EDIT:

Habs herausgefunden:

89 44 10 10 97 108

Wie gesagt ersetzen wie oben erklärt - erst die Kombinationen und dann noch 0A ....

Sollte jetzt klappen.

Ich werde nie behaupten das sei optimal codiert, aber es funktioniert

Java:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;

public class Replace0A0D {

	private static final int maxSize = 1000;
	private static String suchmuster1 = "" + (char)10 + (char)13;
	private static String suchmuster2 = "" + (char)13 + (char)10;
	private static String suchmuster3 = "" + (char)10;

//ACHTUNG: im String ersatz müssen alls Leerzeichen entfernt werden, aber ohne diese wird
// der String hier nicht richtig angezeigt!
	private static String ersatz = "& # 1 3 ; & # 1 0 ; ";

	private static char[] cbuf;
	private static int nrRead = -1;

	public static void print(String str) {
		for(int i=0; i<str.length(); i++) {
			System.out.print((byte)str.charAt(i) + " ");
		}
		System.out.println();
	}

	public static void init() {
		String path = null;
		String file = "Beispiel.params";
		File eingabeFile = new File(path, file);
		cbuf = new char[maxSize];
		nrRead = -1;
		try {
			FileReader fr = new FileReader(eingabeFile);
			nrRead = fr.read(cbuf, 0, maxSize);
			fr.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		init();
		for(int i=0; i<nrRead; i++)
			System.out.print((byte)cbuf[i] + " ");
		char[] cbuf2 = Arrays.copyOf(cbuf, nrRead);
		System.out.println(cbuf2);
		String zeile = new String(cbuf2);
		System.out.println(zeile);
		print(zeile);
		zeile = zeile.replace(suchmuster1, ersatz);
		print(zeile);
		zeile = zeile.replace(suchmuster2, ersatz);
		print(zeile);
		zeile = zeile.replace(suchmuster3, ersatz);
		print(zeile);
		System.out.println(zeile);
	}
}

Optional kannst du noch
Java:
suchmuster4 = ""+(char)13;
definieren und anwenden - dann es ist noch paranoider aber sehr sicher ;-)
 
Zuletzt bearbeitet:
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben