replace und die Umlaute

kodela

Bekanntes Mitglied
Hallo zusammen,

ich habe mir eine simple Anwendung geschrieben, mit der ich grundsätzlich in beliebigen, speziell jedoch in html-Dateien, welche in einem Ordner einschließlich Unterordner liegen, beliebige Textteile ersetzen kann. Bisher habe ich diese Anwendung vor allem dafür verwendet, Pfadbezeichnungen zu verändern. Jetzt wollte ich sie auch dafür verwenden, nicht konvertierte deutsche Umlaute in das UTF-8 Format umzuwandeln. Für den Test habe ich mir eine kurze HTML-Datei geschrieben, in der alle deutschen Sonderzeichen vertreten sind.

Hier ist dann der Teil, in welchem die Ersetzungen über die replace()-Methode vorgenommen werden soll. Nur zum Verständnis: In liste[] sind alle gefundenen HTML-Dateien, die nach der Ersetzung wieder abgespeichert werden.

Java:
      BufferedReader reader;

      try {
          reader = new BufferedReader(new FileReader(liste[i]));
          ArrayList<String> values = new ArrayList<String>();

          String zeile = reader.readLine();                   // erste Zeile einlesen
          while (zeile != null) {                             // solange erfolgreich
              zeile = zeile.replace(suchText, ersatzText);    // korrigieren
              values.add((zeile + "\n").toString());          // Zeile in Liste
              zeile = reader.readLine();                      // nächste Zeile einlesen
       }
       reader.close();

Nun passiert bei mir etwas sehr eigenartiges: In den eingelesenen Zeilen sind die Sonderzeichen als Literale dargestellt und zwar für jedes Sonderzeichen der selbe Code, nämlich '\ufffd'. Dieser entspricht keinem mir bekannten UTF-8 Code und wird von replace() durch das kleine 'ö' ersetzt.

Kann mir jemand erklären, woran das liegt, welchen Fehler ich hier mache.

Im voraus schon einmal einen schönen Dank für jeden Hinweis.

Mit freundlichem Gruß,

Konrad
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Was hälst du davon die Datei mit einem entsprechenden Charset zu lesen und mit UTF-8 Charset wieder zu schreiben?

Das sollten nicht mehr als 10 Zeilen Code sein und erspart die den Ersetzungsaufwand.

- Alex
 

kodela

Bekanntes Mitglied
Hallo Alex,

ehrlich gesagt, ich beschäftige mich erst seit rund drei Wochen intensiver mit Java und habe mit Charsets bisher noch keinerlei Erfahrung. Nur, es geht in meiner Anwendung grundsätzlich ja nicht um das Ersetzten von Sonderzeichen, sondern mehr um die Ersetzung von Adressen oder ähnlichen Textteilen. Dafür ist wohl Charset nicht so besonders geeignet. Das mit den Sonderzeichen ist eigentlich nur ein Nebeneffekt. Trotzdem Danke für Deinen Hinweis, werde mich also auch mit den Charsets vertraut machen.

Mit freundlichem Gruß,

Konrad
 

kodela

Bekanntes Mitglied
Hallo Forumsfreunde,

mittlerweile steht fest, dass es nicht wie ursprünglich angenommen ein Problem mit replace() ist. Es liegt einwandfrei an readLine(), mit der ich Zeile für Zeile einlese. Der von readLine() übergebene String entspricht nicht der einzulesenden Zeile. Alle Sonderzeichen werden einheitlich durch "\ufffd" ersetzt.

Wer hat eine Ahnung, woran das liegen kann.

Mit freundlichem Gruß,

Konrad
 

kodela

Bekanntes Mitglied
Hallo Forumsfreunde,

mittlerweile steht fest, dass es nicht wie ursprünglich angenommen ein Problem mit replace() ist. Es liegt einwandfrei an readLine(), mit der ich Zeile für Zeile einlese. Der von readLine() übergebene String entspricht nicht der einzulesenden Zeile. Alle Sonderzeichen werden einheitlich durch "\ufffd" ersetzt.

Wer hat eine Ahnung, woran das liegen Kann.

Mit freundlichem Gruß,

Konrad
 
T

tuxedo

Gast
Hab ich eben gefunden:

http://1001javatips.com/FileReaderclass.htm hat gesagt.:
You cannot correctly read the contents of non-UTF-16 files with FileReader. That's because you cannot change Java's Unicode's UTF-16 default character encoding using FileReader's constructors. These constructors do not have a provision for specifying the CharSet of the input file. To specify another CharSet yourself, so that you can correctly read the characters of a non-UTF-16 file, chain an InputStreamReader which specifies the necessary CharSet to a FileInputStream. See InputStreamReader class for an example.
 
G

Gast2

Gast
Ich verstehe noch nicht ganz das Problem. Wie sieht jetzt die HTML datei aus?

Steht da jetzt z.B. ö drin oder \u00f6 oder &ouml;?
Ich gehe jetzt mal von "ö" steht im text aus:

Java:
FileInputStream fis = new FileInputStream("meinfile.txt");
InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-1");
StringBuilder buffer = new StringBuilder();
int c;
while ((c = isr.read()) != -1) {
    buffer.append((char) c);
}
String str = buffer.toString();
str = str.replace("ö", "\u00f6 oder \\u00f6 oder &ouml; oder ...");

Wenn du das noch Zeilenweise haben willst könntest du bei \n oder \r\n splitten
Java:
String[] lines = str.split("\n");
 

kodela

Bekanntes Mitglied
Hallo Alex,

herzlichen Dank für den Hinweis. Ich frage mich nur, warum ich in der deutschsprachigen Literatur keinen Hinweis darauf gefunden habe, dass readLine() nur sehr eingeschränkt verwendbar ist.

Mit freundlichem Gruß,

Konrad
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Java ist halt nicht deutschsprachig :eek: Und ein Blick über den Tellerrand mittels Suchmaschine deiner Wahl schadet nie :)
 

kodela

Bekanntes Mitglied
Hallo fassy,

die einzulesende Datei kann von jedem beliebigen Typ sein, sie muss nur auch einen Text enthalten, der mit readLine() gelesen werden soll. Das sind nur bei mir überwiegend HTML-Dateien, aber bei TXT-Dateien haben wir das selbe Problem.

Du könntest jetzt natürlich fragen, warum ich die Dateien mit readLine() einlese und nicht, wie Du es vorschlägst, mit read(). Ganz einfach, weil es readLine() gibt und ich die Daten eben zeilenweise behandeln wollte. Dass dies in der Mehrzahl aller Fälle nicht möglich ist, habe ich weder in der offiziellen Java-Dokumentation zu readLine() noch in einer der wichtigsten deutschsprachigen Publikationen entdecken können.

Ich muss allerdings zugeben, dass in der Dokumentaion zur Klasse FileReader darauf hingewiesen wird.

Ich danke Dir jedenfalls für den Vorschlag, wie man das Problem mir dem FileReader umgehen kann.

Mit freundlichem Gruß,

Konrad
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
Xge Replace x Zeichen aus String Allgemeine Java-Themen 2
Thallius Warum läst mein replace die Klammern drin? Allgemeine Java-Themen 10
B Input/Output BufferedWriter/Reader replace line Allgemeine Java-Themen 6
KaffeeFan Methoden replace alle Buchstaben Allgemeine Java-Themen 3
K String.replace funktioniert nicht Allgemeine Java-Themen 3
nrg Find and replace Text docx Allgemeine Java-Themen 6
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
F Replace von Leerzeichen Allgemeine Java-Themen 8
M Replace Problem Allgemeine Java-Themen 10
L String Replace mit Regulärem Ausdruck Allgemeine Java-Themen 2
E String replace java 1.4 Allgemeine Java-Themen 4
D Abstruse Probleme mit eigenem replace Algorithmus Allgemeine Java-Themen 11
G Mehrmals replace() auf langem String, zu speicherintensiv Allgemeine Java-Themen 10
E String.replace für (sehr) großen Text Allgemeine Java-Themen 9
S ￾ Zeichen umwandeln in ü per .replace(); Allgemeine Java-Themen 6
G spezielles replace Allgemeine Java-Themen 3
C Problem mit String.replace(CharSequence, CharSequence) Allgemeine Java-Themen 3
B Ersatz für "replace" Allgemeine Java-Themen 4
C String replace Allgemeine Java-Themen 8
N iText keine Sonderzeichen und Umlaute unter Windows Allgemeine Java-Themen 13
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
L Tess4j Umlaute anzeigen Allgemeine Java-Themen 3
T Umlaute in Eclipse einlesen funktioniert nicht Allgemeine Java-Themen 16
T Input/Output Konsole gibt trotz printf keine Umlaute aus Allgemeine Java-Themen 17
T Umlaute werden falsch gedruckt Allgemeine Java-Themen 2
F CaesarVerschlüsselung Umlaute Allgemeine Java-Themen 7
F Windows Umlaute Allgemeine Java-Themen 15
MiMa Umlaute beim Einlesen von Dateinamen Allgemeine Java-Themen 12
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
B Zip umlaute Allgemeine Java-Themen 8
S jar-Datei stellt Umlaute nicht dar Allgemeine Java-Themen 6
K Javamail:Probleme mit der Darstellung von Umlaute in Subject Allgemeine Java-Themen 15
S Umlaute machen probleme Allgemeine Java-Themen 3
E HTML File mit Umlaute einlesen Allgemeine Java-Themen 8
R Base64_decode Umlaute Problem. Allgemeine Java-Themen 8
J Umlaute bei Commons-Fileupload Allgemeine Java-Themen 3
T Wie konvertiere ich Umlaute (ä -> ae) ? Allgemeine Java-Themen 7
J Umlaute in regulären Ausdrücken Allgemeine Java-Themen 3
D zeichenerkennung für umlaute bei eingabe Allgemeine Java-Themen 4
S Mac OS JRE verhunst Umlaute Allgemeine Java-Themen 6
G Datei einlesen: Umlaute sind Fragezeichen Allgemeine Java-Themen 23
cover1012 Umlaute in id3 Tags Allgemeine Java-Themen 2
F Umlaute: E-Mail per JavaMail und Textfile Allgemeine Java-Themen 5
J JAR und Umlaute Allgemeine Java-Themen 4
B Umlaute über Konsoloe ein- und ausgeben Allgemeine Java-Themen 5
G Windows Shell Umlaute Problem Allgemeine Java-Themen 19
W Umlaute umwandeln bekomme nur Leerzeichen raus. Allgemeine Java-Themen 11
E Umlaute: FileWriter vs. FileOutputStream Allgemeine Java-Themen 3
W Umlaute in Dateien und Verzeichnissen. Bekomme Fehler Allgemeine Java-Themen 5
M Umlaute richtig dastellen? Allgemeine Java-Themen 4
X Umlaute im JAR-File Allgemeine Java-Themen 4
B Umlaute-Problem bei Plattform-Wechsel Allgemeine Java-Themen 9
C Umlaute mysql Allgemeine Java-Themen 3
F Umlaute in Text . Allgemeine Java-Themen 7
V Umlaute, sonderzeichen beim HTMLEditiorKit Allgemeine Java-Themen 2
O Probleme mit Umlaute Allgemeine Java-Themen 12
B html umlaute decoden Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben