Umbruch
Jörg Wittemeier
- cgi
Hi!
Aus einem mehrzeiligen Textfeld ersetze ich den Umbruch wie folgt.
$text=~s/\n/<br>/g;
Schreibe den Eintrag ansch. in ein Textfile.
funzt auch, aber im Textfile steht vor dem <br> ein kleines schwarzes Kästchen. Muß ich beunruhigt sein?
gruß
jörg
Hi!
Aus einem mehrzeiligen Textfeld ersetze ich den Umbruch wie folgt.$text=~s/\n/
/g;Schreibe den Eintrag ansch. in ein Textfile.
funzt auch, aber im Textfile steht vor dem
»» ein kleines schwarzes Kästchen. Muß ich beunruhigt sein?
gruß
jörg
Hallo Jörg, ich mach das genauso und bin nicht beunruhigt. Das schwarze Kästchen wird nur mit dem Notepad gezeigt jedoch nicht mit einem ASCII Editor.
Kopiere mal dieses schwarze Kästchen und für das mit TextPad in eine neue Datei ein --> es erfolgt ein Zeilenumbruch. IE, Opera und NS interpretieren diesen zusätzlichen Zeilenumbruch nicht.
Viele Grüße, Rolf
Hallo Joerg,
Das liegt vermutlich daran, dass WinX Zeilenumbrueche als CR+LF abspeichert. '\n' ersetzt nur den Carriage Return.
Versuch mal, '\r' (den Linefeed) mit zu ersetzen.
Leider weiss ich nicht, in welcher Reihenfolge die beiden Zeichen erscheinen. Das laesst sich aber bestimmt schnell herausfinden.
Gruss,
Andrea
Hi Angel!
Nur ne kleine Berichtigung... ;-)
Das liegt vermutlich daran, dass WinX Zeilenumbrueche als CR+LF abspeichert. '\n' ersetzt nur den Carriage Return.
\n ist der Line feed, nicht der Carriage return. Das n steht fuer 'new line', wie ich vermute, das r dagegen fuer 'return'.
Versuch mal, '\r' (den Linefeed) mit zu ersetzen.
Du meinst vermutlich mit gar nix? Also s/\r//g; Danach sind alle eventuell vorhandenen \r rausgeschmissen und man hat das UNIX-Format mit einem einfachen \n vorliegen. Dann kann man einfach mit s/\n/<br>/g; weitermachen.
Leider weiss ich nicht, in welcher Reihenfolge die beiden Zeichen erscheinen. Das laesst sich aber bestimmt schnell herausfinden.
Hast Du doch oben geschrieben: CR+LF, also \r\n bzw. 0Dh 0Ah. Aber ist eigentlich egal, wenn man die \r einfach mal pauschal eliminiert. Ich glaube, beim Mac oder so wird eine noch andere Kombination verwendet, aber frag mich nicht, welche.
Calocybe
Hi Calocybe,
\n ist der Line feed, nicht der Carriage return. Das n steht fuer 'new line', wie ich vermute, das r dagegen fuer 'return'.
OK, ich hab'geschludert. Ich schaeme mich ...
Versuch mal, '\r' (den Linefeed) mit zu ersetzen.
Du meinst vermutlich mit gar nix? Also s/\r//g; Danach sind alle eventuell vorhandenen \r rausgeschmissen und man hat das UNIX-Format mit einem einfachen \n vorliegen. Dann kann man einfach mit s/\n/
/g; weitermachen.
Nein, ich meinte etwas in der Art:
s/\n\r/<br>/g
oder
s/\r\n/<br>/g
je nach dem, in welcher Reihenfolge das Zeug nun auftaucht. Damit waere alles auf einen Rutsch bereinigt.
Bei genauerem Nachdenken allerdings scheint es mir doch geschickter das einzeln zu ersetzen. Fuer den Fall dass mal ein unter UNIX/LINUX/Solaris absgespeichetes File auftaucht ...
Hast Du doch oben geschrieben: CR+LF, also \r\n bzw. 0Dh 0Ah. Aber ist eigentlich egal, wenn man die \r einfach mal pauschal eliminiert. Ich glaube, beim Mac oder so wird eine noch andere Kombination verwendet, aber frag mich nicht, welche.
MAC?
Ist mir noch nie unter gekommen ...
Gruss,
Angel
Hi
Hast Du doch oben geschrieben: CR+LF, also \r\n bzw. 0Dh 0Ah. Aber ist eigentlich egal, wenn man die \r einfach mal pauschal eliminiert. Ich glaube, beim Mac oder so wird eine noch andere Kombination verwendet, aber frag mich nicht, welche.
Calocybe
Beim Mac word nur der Carriage Return (Ascii 13, 0Dh) verwendet.
Also müsste beim Mac statt newline (\n) das return-Zeichen (\r) ersetzt werden.
Zum Glück ist das Leben so einfach... :-)
Grüsse Tom
Hi,
Aus einem mehrzeiligen Textfeld ersetze ich den Umbruch wie folgt.
$text=~s/\n/<br>/g;
um das \n von Unix/Linux, das \n\r von Windows und (IIRC) OS/2 sowie das \r von Mac gleichwertig zu behandeln (siehe andere Antworten), verwendest Du am besten folgende RegExp:
$text =~ s/[\n\r]+/<br>/g;
Eventuell kannst Du das "+" noch durch "{1,2}" ersetzen, um nicht "\n\n\n\n\n" auch durch ein einzelnes Break zu ersetzen. Oder aber Du schreibst:
$text =~ s/\n\r\n\r\r\n/<br>/g;
Dann hast Du jede erdenkliche Kombination ohne Verdopplung :-)
Cheatah
Hi,
$text =~ s/[\n\r]+/<br>/g;
Naja, wie Du selbst schon sagtest, wuerde das eine Folgen von mehreren \n eliminieren. Koennen wir also so nicht machen.
Eventuell kannst Du das "+" noch durch "{1,2}" ersetzen, um nicht "\n\n\n\n\n" auch durch ein einzelnes Break zu ersetzen.
Das wuerde aber dummerweise ein \n\n genauso behandeln wie ein \r\n, aber ersteres sind _zwei_ UNIX-Umbrueche und das andere ist nur _ein_ DOS-Umbruch. Geht also auch nicht.
$text =~ s/\n\r\n\r\r\n/<br>/g;
Das gefaellt mir schon recht gut. Nur weiss ich nicht, wie Perl da regiert, wenn es auf \r\n trifft. Wird es gleich mit \r\n zuschlagen, oder wird es erst ein \r erkennen und durch <br> ersetzen und dann ein \n und dieses auch noch ersetzen? Falls letzteres, dann hilft vielleicht schon eine Umstellung der Reihenfolge:
$text =~ s/\r\n\n\r/<br>/g; # \n\r gibt es wohl glaube ich nirgendwo. Aehem.. oder doch?
Falls das nicht ausreicht muesste man wohl notgedrungen etwas wie
if ($text =~ /\n/) {
$text =~ s/\r//g;
$text =~ s/\n/<br>/g;
} else {
$text =~ s/\r/<br>/g;
}
auffahren. Der if-Zweig fuer DOS und UNIX, der else-Zweig fuer den Mac. Falls es wirklich irgendwo sowas wie \n\r geben sollte, wird das im if-Zweig mit abgehandelt.
Wie Tom schon sagte: Zum Glück ist das Leben so einfach... ;-)
Calocybe
P.S. Uebrigens wird in den Netscape-Bookmarkdateien \r\r\n fuer den Umbruch verwendet (vielleicht haben sie fuer den PC aus Versehen zweimal das \n in ein \r\n umgewandelt *g*).
Da wir gerade beim Thema sind:
Gibt es irgendwo ein Konvertierungstool für Windows, dass Textdateien (also auch DB-Files u. ä.) zwischen den Plattformen Unix, Mac, Windows (ANSI), DOS (Codepage 437 o.ä.) konvertiert und dabei die Zeilenenden und _alle_ Sonderzeichen (Ascii > 127) korrekt konvertiert ?
Gibt es eine Perl-Bibliothek mit Funktionen die Strings zwischen den obengenanten Plattformen konvertiert (im Stil: $AnsiString = MacToAnsi($MacString); ) ?
Wenn jemand geeignete Tips hätte, wäre ich dankbar.
Grüsse
Tom
Hi Tom,
Gibt es eine Perl-Bibliothek mit Funktionen die Strings zwischen den obengenanten Plattformen konvertiert (im Stil: $AnsiString = MacToAnsi($MacString); ) ?
Es gibt auf alle Fälle UniCode Module, mit denen man einen String von einer Code-Tabelle zu einer anderen konvertieren kann. Zur Not über den Umweg Tabelle1->Unicode->Tabelle2. Ich meine das Ding was ich mal benutzt habe hieß Unicode::Map8 ...
Gruß,
Jörk
Hi,
$text =~ s/\n\r\n\r\r\n/<br>/g;
Das gefaellt mir schon recht gut. Nur weiss ich nicht, wie Perl da regiert, wenn es auf \r\n trifft. Wird es gleich mit \r\n zuschlagen, oder wird es erst ein \r erkennen und durch
»» ersetzen und dann ein \n und dieses auch noch ersetzen? Falls letzteres, dann hilft vielleicht schon eine Umstellung der Reihenfolge:
eigentlich müßte die Gier der RegExp überwiegen, aber zur Sicherheit kann natürlich umsortiert werden.
$text =~ s/\r\n\n\r/<br>/g; # \n\r gibt es wohl glaube ich nirgendwo. Aehem.. oder doch?
Weiß ich nicht, aber schaden kann's wohl kaum ;-)
Falls das nicht ausreicht muesste man wohl notgedrungen etwas wie
if ($text =~ /\n/) {
$text =~ s/\r//g;
$text =~ s/\n/<br>/g;
} else {
$text =~ s/\r/<br>/g;
}
auffahren. Der if-Zweig fuer DOS und UNIX, der else-Zweig fuer den Mac. Falls es wirklich irgendwo sowas wie \n\r geben sollte, wird das im if-Zweig mit abgehandelt.
Hm, ich weiß nicht... das sagt mir irgendwie nicht zu. Was ist, wenn die Umbrüche nicht einheitlich sind? Wenn irgendwo vereinzelt \r's mit auftauchen? Die werden im if ersatzlos gestrichen.
Wie Tom schon sagte: Zum Glück ist das Leben so einfach... ;-)
Stimmt :-)
P.S. Uebrigens wird in den Netscape-Bookmarkdateien \r\r\n fuer den Umbruch verwendet (vielleicht haben sie fuer den PC aus Versehen zweimal das \n in ein \r\n umgewandelt *g*).
Oh, faszinierend :-)
Cheatah
Tag nochmal!
Hm, ich weiß nicht... das sagt mir irgendwie nicht zu. Was ist, wenn die Umbrüche nicht einheitlich sind? Wenn irgendwo vereinzelt \r's mit auftauchen? Die werden im if ersatzlos gestrichen.
Tja, auf Deutsch sagt man da fuer gewoehnlich, dass man dann ziemlich am Arsch ist, aber das hat jetzt mal keiner gehoert, ok? ;-) Also wenn Du wirklich so seltsame Dateien hast, sind die doch meistens eh' selber produziert, und dann kann man sich drauf einstellen. Wenn das s/\r\n\n\r/<br>/g; zuverlaessig funktioniert (muss man eben ausprobieren), brauchen wir die Fallunterscheidung sowieso nicht, ansonsten muss jeder selber abwaegen, was er fuer moeglich und was fuer wahrscheinlich haelt.
An Tom: So ein Tool ist mir nicht bekannt, aber wenn man mal eine Uebersicht der ganzen Code tables findet, kann man ja ein schnuckliges kleines Perl-Script basteln, das die Sache uebernimmt. Falls Du mit DB-Files die Dateien von echten Datenbanken meinst, wuerde ich die aber in Ruhe lassen.
Calocybe
An Tom: So ein Tool ist mir nicht bekannt, aber wenn man mal eine Uebersicht der ganzen Code tables findet, kann man ja ein schnuckliges kleines Perl-Script basteln, das die Sache uebernimmt. Falls Du mit DB-Files die Dateien von echten Datenbanken meinst, wuerde ich die aber in Ruhe lassen.
Danke.
Bezüglich DB-Files meine ich natürlich komma-separierte oder fixed-length-Dateien.
Bezüglich den Tabellen kann ich die ANSI- und die Mac-Tabelle auftreiben, leider fehlt mir noch die UNIX und die alte DOS-Tabelle. Kann mir hier jemand aushelfen ?
Besten Dank im vorraus.
Grüsse
Tom
Hi Tom!
Bezüglich DB-Files meine ich natürlich komma-separierte oder fixed-length-Dateien.
Ja, besser ist das. ;-)
Bezüglich den Tabellen kann ich die ANSI- und die Mac-Tabelle auftreiben, leider fehlt mir noch die UNIX und die alte DOS-Tabelle. Kann mir hier jemand aushelfen ?
Es gibt sicher nicht nur DIE Unix-Tabelle, genauso wie man bei DOS verschiedene Code pages einstellen kann (z.B. war bei der deutschen Auslieferung die 850 voreingestellt, die man dann erst mal eigenhaendig wieder auf die 437 zurueckbiegen musste, um ein paar vernuenftige Rahmenzeichen darstellen zu koennen).
Wegen so eines Scriptes werde ich Dich mal per Mail contacten, aber jetzt bin ich erst mal ein paar Tage im Off und werde heute bei mir zu Hause die Kiste nicht mehr anschalten, also nicht ungeduldig werden... ;-)
Calocybe