Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10439[/thread]

backslashes in dateien (open command)

Leser: 1


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
philbert
 2007-09-21 16:54
#99815 #99815
User since
2007-09-21
7 Artikel
BenutzerIn
[default_avatar]
He Folks!

Ich hab hier ein Problem, was mich wahnsinnig macht und ich scheine auch noch unfähig zu sein es per google zu lösen ;)

Das Szenario ist eigentlich, dass ich template dateien habe, die ich einlesen will und die
Codefetzen enthalten (in diesem Fall relevant ist latex code z.B. wegen \paragraph) und teilweise auch regex'es , die ich lesen und auf strings s///'en will.

Das ganze ist aber nicht so wichtig, weil ich das Problem eh testweise auf's Wesentliche
reduziert habe:

Input File (test.in):
Code: (dl )
1
2
3
\test
\\test1
\test2 \test3 \\test4

(der Listmode in VIM zeigt mir auch an, dass es echt nur die sichtbaren chars sind - bis auf \n's und EOF gibt es in der Datei keine control chars)

Program File (test.pl)
Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl -w 

open (FILE, "test.in");
my @text = <FILE>;
foreach my $line (@text) {
print $line;
}
close FILE;


Ursprünglich fand das Lesen im Slurpmode statt - ist aber vom Resultat her irrelevant, beim ausführen von test.pl präsentiert mir die bash nämlich:
Code: (dl )
1
2
3
¥test
¥¥test1
¥test2 ¥test3 ¥¥test4


So what's this? Warum werden meine Backslashes durch seltsame specialchars ersetzt, die sich auch nicht im nachhinein weg-replacen lassen? Hat das was mit File-Encodings zu tun?

Danke für etwaige Denkanstöße schonmal im Voraus,

Paul Hilbert
Linuxer
 2007-09-21 17:18
#99820 #99820
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
spontan würde ich auf die Paarung "utf8 vs latin1" tippen.
Das Latex Dokument ist in utf8, das Skript verarbeitet nur latin1 ...
Es gibt hier aber sicherlich Spezis, die sich mit genau dieser Thematik näher befasst haben.
Ich habe bisher immer einen Bogen um utf8 gemacht ;)

Was sagt denn vim zum fileencoding?
Wenn es nicht in der Statusbar steht, dann sollte ein ":set fenc" und ein ":set enc" verraten, welche Encodings für diese Datei gelten.

Das gleiche wäre beim Skript zu prüfen...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
philbert
 2007-09-21 17:47
#99829 #99829
User since
2007-09-21
7 Artikel
BenutzerIn
[default_avatar]
Fileencoding war bei der Datei utf-8 und beim Script nicht angegeben.
Ein set fenc=utf8 hat es auch auf utf8 gesetzt, was allerdings nichts
gebracht hat.

Hab auch (zusätzlich) probiert den open Befehl zu
Code: (dl )
open (FILE, "<:utf8", "test.in");
zu ändern,
was ebenfalls kein Erfolg mit sich brachte...

Ich hab inzwischen auch schon eine richtige Aversion
gegen utf8 (eher dessen Umsetzung) - besonders bei
php hat der Spaß damit mein Leben um wenigstens
3 Jahre verkürzt ;)
Linuxer
 2007-09-21 18:21
#99830 #99830
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Worauf arbeitest Du denn? WinDOS oder Linux?

Wenn nicht anderes geschrieben steht, beziehe ich mich auf eine Linux-Umgebung und entsprechende Tools.

Versuch doch mal, dass Latex-Dokument mittels "recode" in latin1 umzuwandeln.

recode utf8..latin1 document.tex

Und lass dann mal Dein Skript über die konvertierte Datei laufen.

Das Skript selber in utf8 abzuspeichern dürfte wenig helfen.
Afaik solltest Du, wenn die Skriptdatei selber in utf8 codiert ist, "use utf8;" verwenden.
Entscheidender sollten eigentlich die open-Geschichten sein, die Du ja bereits (erfolglos) getestet hast.

Aber was ist mit STDOUT, auf der Du das ausgibst? Macht die utf8? oder "nur" latin1? Möglicherweise liegt hier der Bock noch im Garten.

Schreib den Output doch mal in eine utf8-codierte tmp. Datei und kontrollier die mal im vim, was da rauskommt...

EDIT: Die Geschichte ums "recode" und die Geschichte ums utf8-STDOUT sind zwei verschiedene; sollten also auf jeden Fall unabhängig voneinander getestet werden...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
philbert
 2007-09-21 18:53
#99831 #99831
User since
2007-09-21
7 Artikel
BenutzerIn
[default_avatar]
Natürlich Linux (auf dem relevanten Rechner läuft Ubuntu).
Nach dem schreiben in eine Datei zeigt vim mir alles richtig an und less nicht - das spricht also dafür, dass es die Kommandozeile ist.

Insofern ist des hier wohl solved. Danke!

Das mit dem recode funktioniert allerdings nicht - ich kann sogar in nano kein Backslash mehr tippen. Aber damit setze ich mich erstmal selbst auseinander ^^
sid burn
 2007-09-21 19:39
#99834 #99834
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Das File Encoding spielt hier eigentlich keine Rolle, da du nur Zeichen aus den ASCII bereich nutzt. Und die haben bei utf8 und latin1 und allen anderen iso-8859-x Codierungen die selbe Byte darstellung.

Und auch so lässt sich anhand deines Beispieles das Problem nicht nachvollziehen. Bei mir wird alles richtig ausgegeben.

Probleme könnte es nur geben wenn das Backslash in deiner Quelldatei wirklich ein Unicode Zeichen ist, und das zufällig genau ausschaut wie ein Backslash. Ich würde mal die Originaldatei mit einem Hexeditor öffnen, wenn das Backslash mehr als ein Byte groß ist, dann ist das der Fall.

Ansonsten kannst du vielleicht eine Datei + Skript auf deinen Rechner irgendwie mal packen und zum DL zur Verfügung stellen?


Ansonsten wenn es eine utf8 File ist, oder Generell Zeichen genutzt werden im Bereich von 128-255 musst du bestimmte dinge beachten.

Code: (dl )
use utf8

Das solltest du schreiben wenn das Skript selber UTF8 Codiert gespeichert wird, und auch Zeichen > 128 enthält.


Code: (dl )
open my $fh, '<:utf8', $file ....

Sowas solltest du machen wenn die Datei utf8 Decodiert gespeichert wurde.


Code: (dl )
binmode STDOUT, ':utf8'

Sowas solltest du machen wenn du utf8 Zeichen ausgeben möchtest. Bzw. wenn du ein UTF8 Terminal hast, musst du das auch bereits eintippen. Unabhängig davon in welcher Codierung deine Datei liegt.


Wird sowas nicht explizit angegeben, geht Perl bei den einzelnen Punkten immer von einer iso-8859-1 Codierung aus.


Optional kann ich immer empfehlen nen Terminal zu nutzen wo du einfach die Codierung hin und her schalten kannst, beim gnome-terminal kannst du einfach Codierungen hinzufügen, und stell das Terminal mal auf iso-8859-1 und führe dann das Skript aus.


Und UTF8 und der Unicode krempel ist eigentlich total einfach. ;) Selbst schuld wenn ihr euch immer davor drückt. ^^
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Linuxer
 2007-09-21 21:04
#99837 #99837
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
OFFTOPIC:

sid burn+2007-09-21 17:39:25--
Und UTF8 und der Unicode krempel ist eigentlich total einfach. ;) Selbst schuld wenn ihr euch immer davor drückt. ^^


Prinzipiell geb ich Dir recht. Aber die "Schuld" seh ich wo anders.
Man macht so seine Erfahrungen. Und wenn die beim Thema utf* negativ ausfallen (wiederholt), dann meidet man es entsprechend.

Wirklich positiv ist mir utf* noch nicht aufgefallen!

Aber was soll's? Möge jeder codieren wie er mag ;)

edits: kleinere Makel korrigiert.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
sid burn
 2007-09-21 21:24
#99838 #99838
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Linuxer+2007-09-21 19:04:18--
Prinzipiell geb ich Dir recht. Aber die "Schuld" seh ich wo anders.
Man macht so seine Erfahrungen. Und wenn die beim Thema utf* negativ ausfallen (wiederholt), dann meidet man es entsprechend.

Ich sags mal so. Probleme entstehen eher dadurch das an irgendeiner Stellte kein utf8 verwendet wird. utf8 kann alle Zeichen darstellen, was soll es da für Probleme geben? Probleme entstehen erst dadurch das an irgendeiner stelle kein utf8 verwendet wird, und dann irgendetwas nicht klappt. Das ist dann aber eher die Schuld das noch nciht überall utf8 verwendet wird.

Wenn du möglichst wenig Probleme mit Zeichenkodierungen haben möchtest, und dich damit am wenisgsten auseinander setzen möchtest welche Codierung du jetzt nimmst und wie und wohin du Codieren musst dann ist das einfachste überall utf8 zu haben. Den dort hast du genau solche Probleme nicht.

Nur mit den alten Zeichensätzen hast du solche Probleme. Und genau das sind dann auch die positiven Sachen von utf8. ;) Alles wird einfacher.

Quote
Wirklich positiv ist mir utf* noch nicht aufgefallen!


Quote
Aber was soll's? Möge jeder codieren wie er mag ;)

Bloß nicht! utf8 behebt alle Probleme mit den zeichensätzen also sollte man es auch nutzen. ;) Und davor drücken kann man sich eh nicht. utf8 setzt sich immer mehr durch. Und Unicode wird in Perl 6 auch ein tiefer bestandteil sein, je früher man anfängt sich mit dem Thema auseinander zu setzen, umso besser.

Aber ich wollte ja sowieso noch nen unicode/utf8 Artikel für Perl schreiben. ;) Wenn ich dazu nur kommen würde...
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
philbert
 2007-09-21 21:32
#99839 #99839
User since
2007-09-21
7 Artikel
BenutzerIn
[default_avatar]
Ich habe das Problem gelöst. Dazu sei vorher angemerkt, dass ich heute mittag noch zu
meiner Freundin sagte, dass es wenn ich mal nachfragen muss (ist das letzte mal vor über einem Jahr passiert) es eh immer peinlich trivial ist und siehe da; die Lösung war:

Tilda neustarten. Nein, ich hab nichts an "ihrer" config geändert, einfach neu gestartet. Peinlich sowas... (tilda ist doch (ein) konsole(-fork), oder?)


"Und UTF8 und der Unicode krempel ist eigentlich total einfach."

Ich hoffe das ist ironie ;)
Ich habe 2 Monate meines Lebens damit "verschwendet" einen XML-Parser für php zu schreiben, der mit UTF-8/-16 *wirklich* klarkommt. Das gab's damals nicht wirklich und auch heute dauert das gentoo-unicode-capable-machen meistens länger als mir lieb ist ^^
sid burn
 2007-09-21 23:35
#99841 #99841
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
philbert+2007-09-21 19:32:44--
Ich hoffe das ist ironie ;)
Ich habe 2 Monate meines Lebens damit "verschwendet" einen XML-Parser für php zu schreiben, der mit UTF-8/-16 *wirklich* klarkommt. Das gab's damals nicht wirklich und auch heute dauert das gentoo-unicode-capable-machen meistens länger als mir lieb ist ^^

Nein das ist keine Ironie.
Unicode und UTF8 ist einfach wenn es so wie in Perl seit 5.8 fest eingebaut ist.

Wenn du mit nem schlechten Web Framework schlechte Erfahrung gemacht hast weil PHP sowas nicht unterstützt dafür kann ich ja nichts. ;)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2007-09-21 16:54.