Das ewige Leid mit den Umlauten -» Perl -» HTML
Matze2K
- perl
0 Cheatah0 Matze2K
0 klaus
Hallo @all,
ich weiss nicht, wieviele sich an dieser Sache schon die Zähne
ausgebissen haben - ich bin gerad dabei ! Ich habe schon soviele
Möglichkeiten durchprobiert und auch schon mal ins Archiv geschaut
aber - nichts ! Ich finde einfach keine Lösung ! Dabei kann es so
schwer gar nicht sein !
Ich habe in den DOS-Editor Daten eingegeben und diese in einer Datei abgespeichert ! Diese habe ich dann auf einen Unix-Server gestellt
und verusche nun verzweifelt den Inhalt mit Hilfe eines Perl-Scriptes richtig auszulesen ! Hier werden aber ständig die Umlaute
nicht HTML-Konform ausgegeben !
Einer Meiner Versuche:
for(<FILE>)
{
$_ =~ s/ä/ä/g;
usw. (für andere Umlaute)
push (@data, $_);
}
Wie gesagt, es läuft nicht !
Ich wäre über eine Antwort wirklich sehr erfreut !
Matze2K
Hi,
for(<FILE>)
{
»» $_ =~ s/ä/ä/g;
usw. (für andere Umlaute)
»» push (@data, $_);
}
while (<FILE>) {
s/ä/ä/g;
push @data, $_;
}
Du willst aber eigentlich HTML::Entities benutzen.
Wie gesagt, es läuft nicht !
Als da hieße?
Cheatah
Als da hieße?
Er ersetzt die Umlaute nicht ! Auch mit while(<FILE>) funktioniert es
nicht ! Ich versteh' es einfach nicht !
Hast Du vielleicht noch eine Idee ??
Vielen Dank
Matze2K
Hi,
Er ersetzt die Umlaute nicht ! Auch mit while(<FILE>) funktioniert es
nicht ! Ich versteh' es einfach nicht !
was für Debug-Ausgaben hast Du versucht? Wo ist das Script / die Datei online lesbar?
Hast Du vielleicht noch eine Idee ??
Ja, die steht aber schon in meiner vorherigen Antwort.
Cheatah
Vielen Dank für Eure Tips, aber es funktioniert einfach nicht !
Nochmal das Script:
open(DB, "<$save_path"); #öffnen der DOS-ASCII-file
while ($line = <DB>)
{
chop($line);
chop($line);
$line =~ s/ü/ü/g; @cheatah was meinst du mit HTML::En???
push(@data, $line);
}
Vielleicht noch eine Idee ?
Die Ausgabe ist bspw.: "dies ist leider ungültig"
<->
Danke
Matze2K
hallo
<ACHTUNG>
ich bin selbst nich so ne art anfänger, d.h was ich jetz sage könnte falsch sein, ich glaub aber es stimmt...
</ACHTUNG>
$line =~ s/ü/ü/g;
damit suchst du nach "ü" und ersetzt es mit "ü", bringt also gar nix. was cheatah meinte ist, du musstt folgendes schreiben:
$line =~ s/ü/ü/g;
dann wird "ü" mit "ü" ersetzt, und es funktioniert...
gruss
Eckhart
mist! das forum übersetzt es gleich wieder zu ü, man kann also nicht sehen was ich meine...
$line =~ s/ü/&_uuml_;/g;
ohne die beiden unterstriche, dann sollte es klappen...
Hallo,
mist! das forum übersetzt es gleich wieder zu ü, man kann also
nicht sehen was ich meine... KANN DIR NUR RECHT GEBEN !
Ich meinte:
open(DB, "<$save_path"); #öffnen der DOS-ASCII-file
while ($line = <DB>)
{
chop($line);
chop($line);
$line =~ s/ü/&_uuml_;/g;
push(@data, $line);
}
Trotzedem noch einen Einfall, warum es nicht klappt ???
Matze2K
Trotzedem noch einen Einfall, warum es nicht klappt ???
Gaehn! Ich habe dir doch schon mitgeteilt, wo dein Fehler liegt. Da Du deine Datei unter MSDOS erstellt hast, kommt kein latin1-ü darin vor. Die Ersetzungen bringen also gar nichts.
Peter
:-(
Stadt hier rumzugaehen könntest Du mir vielleicht sagen, wie man dann
das Problem alternativ lösen kann !
Vielen Dank
Matze2K
Hallo Matze2K,
ist recht lustig der thread.
Vielleicht ist Dir mein Kommentar dazu entgangen.
Wenn Du 'ü' schreibst, kann das ja im Editor recht nett aussehen, aber das Script auf einem anderen Rechner glaubt, Du hast ' à' oder was auch immer gemeint. Und deshalb findet er kein 'ü' und ersetzt es auch nicht.
Nochmals mit anderen Worten: "ASCII-Zeichentabellen können in unterschiedlichen Betriebsystemen unterschiedlich aufgebaut sein!'.
Das ist das Problem, daß wir alle haben, seit irgendwer draufgekommen ist, daß es auf der Welt mehr als 256 verschiedene Schriftzeichen gibt.
Um alle Unklarheiten zu entfernen, sag' uns bitte die Ascii-Werte deiner Umlaute im Original und auf Deiner Unix-Mühle.
Dazu gehts Du, wenn Du es sonst nicht rausbekommst, wie folgt vor:
1.) erstelle auf beiden Systemen eine Datei mit folgendem Inhalt:
'äöüÄÖÜß'
( Das mußt Du aber auf beiden System extra machen. Also nicht mit Windows-Editor und dann per FTP (binär vielleicht noch) auf den Unix-Rechner übertragen.
2.) Ermittle irgendwie die Ascii-Werte
3.) Vergleiche beide Ergebnisse und wenn dann noch nicht alles klar ist, dann melde Dich wieder.
hier ein kleines, nicht gerade berauschendes stück Perl-Code, daß das erledigt. (Ui, da werden wieder Proteste kommen)
#!/usr/bin/perl
$x = 'äöüÄÖÜß';
$x =~ s/(.)/$1.'='.ord($1)."\n"/ge;
print $x;
Dann solltest Du vielleicht noch Dein lokales auf den Server übertragen (genau so, wie Du es mit der anderen Datei gemacht hast) und dir ansehen, ob bei der Übertragung auch noch was umgemodelt wird.
Dies Test möchte ich Dir genre Empfehlen um Deinem Problem auf die Spur zu kommen.
Grüße
Klaus
Hallo Klaus,
danke für Deine ausführliche Antwort - wird ein hartes Stück Arbeit !
Was ich allerdings nicht ganz verstehe: ich weiss, dass es verschiedene Zeichensätze gibt, die unterschiedlich aufgebaut sind -
warum aber ist der ASCII-Zeichensatz mal so und mal so einprogrammiert ?
Danke nochmal
Matze2K
Hallo Matze2K,
Hallo Klaus,
danke für Deine ausführliche Antwort - wird ein hartes Stück
Arbeit !
ähm .. kann es sein das du <98208.html> nicht gelesen hast?
Gruss,
Carsten
Hallo,
open(DB, "<$save_path"); #öffnen der DOS-ASCII-file
Vielleicht erstmal die unter Unix überflüssigen CR Zeichen ( \r ) entfernen.
siehe auch
<../../sfarchiv/2000_2/t14099.htm#a71916>
while ($line = <DB>)
{
»» chop($line);
»» chop($line);
»» $line =~ s/ü/&_uuml_;/g;
Jetzt hier, falls es nicht eh schon funktioniert(glaube es aber kaum ;-), statt dem "ü" usw, die Hexwerte aus der DOS-ASCII Tabelle einsetzen:
siehe auch:
<../../sfarchiv/1999_4/t08386.htm#a42273>
»» push(@data, $line);
}
wenn noch was fehlt:
http://www.teamone.de/cgi-local/sfasuch.pl?suchausdruck=ASCII+DOS&feld=alle&hits=alle
Viel Vergnügen noch
Christoph
Hi,
was cheatah meinte ist, du musstt folgendes schreiben:
use HTML::Entities;
print HTML::Entities::encode_entities('Gänzlich vühle Ümläutä');
Cheatah
Hallo Matze2K,
Die Ausgabe ist bspw.: "dies ist leider ungültig"
Tja, das ist ein DOS ü und kein Windows ü.
Wenn du dein Script unter Windows edierst passiert das nicht.
Der Windows-Zeichensatz ist (100%?) identisch zum Web-üblichen
iso-8859-1 ("Latin-1") Zeichensatz.
<../../thb.htm#a201>
Aber der DOS Zeichensatz ist anders. Und das unlesbare ü oben
ist ein DOS ü!
Zeichencodes (hex)
DOS WIN
ä 84 e4
ö 94 f6
ü 81 fc
Ä 8E c4
Ö 99 d6
Ü 9A dc
ß E1 df
Da man in Perl mit \0x84 Zeichen mit ihrem Hex-Codes angeben kann müsste
folgendes gehen :
$line =~ s/\0x81/ü/g;
wenn du DOS-Codes wandeln willst bzw.
$line =~ s/\0xfc/ü/g;
für Windows Codes, und zwar unabhängig vom Zeichensatz des Editors mit dem
du das erstellst.
Gruss,
Carsten
Moin Kartsen,
ich weiss auch nicht was los ist - ich hab's eingesetzt
und es läuft einfach nicht - krieg bald das heulen hier!
Bitte schau nochmal: ---Script---
open (DB, "<$save_path");
while ($line = <DB>)
{
chop($line);
chop($line);
$line =~ s/\0x84/&_*uuml;/g; *gegen HTML-Umwandlung
push(@data, $line);
}
Vielen Dank
Matze2K
Hi Matze2K,
»» $line =~ s/\0x84/&_*uuml;/g; *gegen HTML-Umwandlung
falsch, da:
ä 84 -> ä
ö 94 -> ö
ü 81 -> ü
Ä 8E -> Ä
Ö 99 -> Ö
Ü 9A -> Ü
ß E1 -> ß
muss es ja wohl:
$line =~ s/\0x84/ä/g;
heissen um ein ä zu konvertieren und:
$line =~ s/\0x81/ü/g;
um ein ü zu konviertieren.
<../../tgch.htm#a1>
<../../tgck.htm#a6>
Gruss,
Carsten
Hallo,
Er ersetzt die Umlaute nicht ! Auch mit while(<FILE>) funktioniert es
nicht ! Ich versteh' es einfach nicht !Hast Du vielleicht noch eine Idee ??
Ich hätte da was. Wer ich bin ? Der wahrscheinlich grösste Umlaut-Depp den ich kenne ;-)
Nein, ich hab schon mal in einem ellenlangen Thread mich über mein Umlautproblem ausgelassen. Der müsste auch irgendwo im Archiv sein - sehr interessant: wir haben uns wirklich angeregt über ASCII-Tabellen u.s.w. unterhalten. Ich habe dabei jedenfalls viel gelernt.
Mein Problem war: ich wollte eine Mail mit Bestell- und Personenbezogenen Daten verschicken. Da schnell mal jemand Müller heisst, hatte ich schnell mal ein Problem: Er hies nämlich in der mail Müller !! Etwas unschön.
Schlussendlich half mir dieses kleine Unterprogramm.
// sub encode_mail() {
// $mail_rows =~ s/ä/ä/g; $mail_rows =~ s/Ä/Ä/g;
// $mail_rows =~ s/ü/ü/g; $mail_rows =~ s/Ü/Ü/g;
// $mail_rows =~ s/ö/ö/g; $mail_rows =~ s/Ã-/Ö/g;
// $mail_rows =~ s/ß/ß/g;
// }
... Zwar nicht der Weisheit letzter Schluss, aber es ist einfach und funktioniert.
Allerdings kam das ganze bei mir aus einem Formular. Wenn ich Umlaute aus einer Datei einlese gibts bei mir keine Probleme !
Versuch doch mal das:
// open (FILE, $filename) die "Can't open $filename: $!";
// while ($line = <FILE>) {
// push(@data, $line); # oder was immer du mit den Daten vorhast!
// }
// close (FILE) die "Can't close $filename: $!";
Ich hoffe ich habe dein Problem richtig verstanden!
grüsse
bernhard
Als da hieße?
Er ersetzt die Umlaute nicht ! Auch mit while(<FILE>) funktioniert es
nicht ! Ich versteh' es einfach nicht !
Behandle die Ausgangsdatei mit recode (recode ibmpc:lat1). Du kannst vielleicht auch waehrend der Laufzeit Convert::Recode einsetzen.
Peter
Hallo,
Ich habe in den DOS-Editor Daten eingegeben und diese in einer Datei abgespeichert ! Diese habe ich dann auf einen Unix-Server gestellt
Kann es sein, daß Du ein Problem mit den Zeichensätzen hast? Stichwort: 'DOS-Editor'
DOS und Windows verwenden unterschiedliche ASCII-Kodes für Umlaute, und bei Unix ist's auch so.
Das muß jetzt nicht unbedingt sein, aber sieht ganz danach aus.
Nur so eine Idee.
klaus