Schrift
[thread]8713[/thread]

UTF8-Datei mit BOM schreiben: BOM automatisch erzeugen

Leser: 2


<< >> 6 Einträge, 1 Seite
sesth
 2007-02-01 17:27
#73942 #73942
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Ich möchte eine Datei im UTF-8-Encoding schreiben und (um Verwechslungen mit anderen Zeichensätzen auszuschließen) eine Byte-Order-Mark (BOM) am Dateianfang setzen. Mit
Code: (dl )
1
2
3
4
5
6
7
use open IO => ':utf8';
use strict;

my $text = 'Umlaut Ü';
open(OUT, '>', 'test.txt') || die "test.txt:$!";
print OUT "$text\n";
close(OUT);

wird zwar UTF-8 geschrieben , leider ohne BOM. Kann man Perl dazu bewegen, eine BOM automatisch zu erzeugen oder muss ich das selbst ausgeben?
Gruß
Thomas
styx-cc
 2007-02-01 19:02
#73943 #73943
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Hilft vielleicht CPAN:File::BOM ?

MfG
Pörl.
sesth
 2007-02-01 23:37
#73944 #73944
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Danke für den Tipp. Bei CPAN bin ich fündig geworden. Es ist zwar keine Automatik, aber so geht es:
Code: (dl )
1
2
3
4
5
6
7
8
use UTF8BOM;
use Encode;
use strict;

my $text = 'Umlaut Ü';
open(OUT, '>', 'test.txt') || die "test.txt:$!";
print OUT UTF8BOM->insert_into_str(encode("utf8", "$text\n"));
close(OUT);

Das Encoding auf File-Ebene musste ich entfernen, da sonst die BOM mit encoded wird :( .
Gruß
Thomas
ptk
 2007-02-02 00:00
#73945 #73945
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ein BOM ist eigentlich auch nur ein normales Unicode-Zeichen. Mit
Code: (dl )
print OUT "\x{feff}$text"
(ungetestet) sollte es eigentlich auch gehen.
sesth
 2007-02-02 00:07
#73946 #73946
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Ja, das stimmt. Mir schwebte aber eine Automatik vor. Durch "use open IO => ':utf8'" wird ja die Ausgabe auf UTF8 umgestellt. Da der BOM aber ein nicht gültiges UTF-Zeichen ist, wird die Zeichenfolge beim Ausgeben entschärft (encoded) und dann ist es in der Datei kein BOM mehr. Meine Ideallösung wäre, bei "use open IO => ':utf8'" mit anzugeben, dass ein BOM erzeugt werden soll. Aber da bin ich leider nicht fündig geworden.
Gruß
Thomas
ptk
 2007-02-02 00:45
#73947 #73947
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Bei use open kann man ja ein beliebiges Encoding mit ':encoding(...)' angeben. Und es sollte möglich sein, eigene Encodings zu definieren (siehe Encode::Encoding). Zusammen könntest du vielleicht diesen Automatismus erreichen?
<< >> 6 Einträge, 1 Seite



View all threads created 2007-02-01 17:27.