Det samme skete hvis jeg skabte en fil med kun eet unicode tegn i og lod
perl l�se det med 'open' og printe det.
Til sidst inds� jeg at man kunne l�se problemet ved at s�tte binmode p�
input handlet til filen.
YAML ser dog ikke ud til at kunne h�ndtere dette, s� har �ndret i sourcen
[2], hvorefter det fungerer fint.
Virker det som en rimelig modifikation eller kan jeg g�re noget andet og
smartere?
[1]
F�r:
'comment' => 'LATIN SMALL LETTER U WITH DIAERESIS',
'binary' => '1111110',
'string' => 'ü'
Efter:
'comment' => 'LATIN SMALL LETTER U WITH DIAERESIS',
'binary' => '1111110',
'string' => "\x{fc}"
[2]
sub LoadFile {
my $IN;
my $filename = shift;
my $utf8 = shift; # ADDED
if (ref $filename eq 'GLOB') {
$IN = $filename;
}
else {
open $IN, $filename
or YAML::Base->die('YAML_LOAD_ERR_FILE_INPUT', $filename, $!);
# ADDED
binmode($IN, ':ut8')
if defined $utf8;
}
return Load(do { local $/; <$IN> });
}
> Jeg har haft store problemer med at mine UTF-8 YAML filer fik non-ascii
> karakterer lavet om til "noget andet" [1].
> Det samme skete hvis jeg skabte en fil med kun eet unicode tegn i og lod
> perl l�se det med 'open' og printe det.
Har du sat din locale m�rkeligt op? Kan du ikke pr�ve at vise et
minimalt eksempel p� det med open()?
For mig ser det ud til at "roundtrip'e" fint:
$ perl -MYAML::Syck -MData::Dumper -e 'DumpFile("/tmp/test.yml", { test=>"Fr�kke fr�l�r" }); my $data=LoadFile("/tmp/test.yml"); print Dumper($data);'
$VAR1 = {
'test' => 'Fr�kke fr�l�r'
};
$ cat /tmp/test.yml
---
test: "Fr\xC3\xA6kke fr\xC3\xB8l\xC3\xA5r"
$
(LC_CTYPE=da_DK.UTF-8 og perl 5.10.0 h�r).
Mvh.
Adam
--
"But they are all following you! Adam Sj�gren
No, they ain't, I'm just in front" as...@koldfront.dk
Det kan jeg ikke afvise :-)
declare -x LANG="en_US.UTF-8"
> minimalt eksempel p� det med open()?
1) Filen
--------
$ cat u.txt
�
$ file -bi u.txt
text/plain; charset=utf-8
$ od -tx1 < u.txt
0000000 c3 bc 0a 0a
0000004
2) uden binmode
---------------
#!/usr/bin/perl
binmode ('STDOUT', ':utf8');
use strict;
use warnings;
use Data::Dumper;
open (FILE, 'u.txt') or die $^E;
my $u = join('', <FILE>);
print $u ."\n";
close (FILE);
$ perl test_suite/load_7bit.pl
ü
3) med binmode
---------------
#!/usr/bin/perl
binmode ('STDOUT', ':utf8');
use strict;
use warnings;
use Data::Dumper;
open (FILE, 'u.txt') or die $^E;
binmode(FILE, ':utf8');
my $u = join('', <FILE>);
print $u ."\n";
close (FILE);
$ perl test_suite/load_7bit.pl
�
Det ser sk�rt ud hvis man sp�rger mig...
> #!/usr/bin/perl
> binmode ('STDOUT', ':utf8');
Hvorfor s�tter du den?
> use strict;
> use warnings;
> use Data::Dumper;
> open (FILE, 'u.txt') or die $^E;
> my $u = join('', <FILE>);
> print $u ."\n";
> close (FILE);
> $ perl test_suite/load_7bit.pl
> ü
Jeg f�r:
$ echo '�' > u.txt
$ cat u.txt
�
$ hexdump u.txt
0000000 bcc3 000a
0000003
$ perl -MFile::Slurp -e 'my $txt=read_file "u.txt"; print $txt;'
�
$ perl -MFile::Slurp -e 'my $txt=read_file "u.txt"; print $txt;' | hexdump
0000000 bcc3 000a
0000003
$
Men hvis jeg laver dit "s�t binmode :utf8 p� STDOUT"-trick, s� f�r jeg:
$ perl -MFile::Slurp -e 'my $txt=read_file "u.txt"; binmode "STDOUT", ":utf8"; print $txt;'
ü
$ $ perl -MFile::Slurp -e 'my $txt=read_file "u.txt"; binmode "STDOUT", ":utf8"; print $txt;' | hexdump
0000000 83c3 bcc2 000a
0000005
$
S� ska' du ikke bare lade v�re med det og s� virker det?
Mvh.
Adam
--
"En fjern transistor stiller ind p� Kalundborg" Adam Sj�gren
as...@koldfront.dk
For ellers fungerer det ikke :-)
Se de to eksempler hvor det eneste der adskiller sig er brugen af binmode
eller ej og dermed output.
>> $ perl test_suite/load_7bit.pl
>> ü
Det er uden binmode.
Med:
$ perl test_suite/load_7bit.pl
�
> Men hvis jeg laver dit "s�t binmode :utf8 p� STDOUT"-trick, s� f�r jeg:
>
> $ perl -MFile::Slurp -e 'my $txt=read_file "u.txt"; binmode "STDOUT",
> ":utf8"; print $txt;'
> ü
Det kunne v�re at jeg alligevel ikke har et helt rent ut-8 milj�...
N�r du s�tter den konverterer den den tilsyneladende een gang til?
N�r jeg ikke s�tter den har jeg s� problemet.
Fik blandet lidt rundt i det.
Hvis jeg ikke s�tter den, s� f�r jeg m�rkelige tegn i putty:
"ogs�"
> Se de to eksempler hvor det eneste der adskiller sig er brugen af binmode
> eller ej og dermed output.
binmode her er helt nede i YAML koden.
S� egentligt har jeg to binmodes.
En p� IN filer i YAML, og en p� STDOUT.
> "Adam "Sj�gren"" <as...@koldfront.dk> wrote in message
> news:87eite3...@topper.koldfront.dk...
>> On Sat, 20 Jun 2009 22:40:40 +0200, Morten wrote:
>>> binmode ('STDOUT', ':utf8');
>> Hvorfor s�tter du den?
> For ellers fungerer det ikke :-)
Du viste ikke hvad der sker n�r du fjerner den?
> Se de to eksempler hvor det eneste der adskiller sig er brugen af
> binmode eller ej og dermed output.
Ja, om du s�tter binmode p� FILE eller ej.
Forskellen mellem dine eksempler og mine er at det der virker for mig,
s�tter jeg _overhovedet_ ikke s�tter binmode, alts� heller ikke p�
STDOUT.
>>> $ perl test_suite/load_7bit.pl
>>> ü
> Det er uden binmode.
P� FILE, men _med_ p� STDOUT!
> Det kunne v�re at jeg alligevel ikke har et helt rent ut-8 milj�...
M�ske...
Mvh.
--
"My brain always rejects attitude transplants." Adam Sj�gren
as...@koldfront.dk
> Hvis jeg ikke s�tter den, s� f�r jeg m�rkelige tegn i putty:
> "ogs�"
M�ske din putty er fejlkonfigureret?
>> Se de to eksempler hvor det eneste der adskiller sig er brugen af binmode
>> eller ej og dermed output.
> binmode her er helt nede i YAML koden.
Den er jeg med p�, men det virker som om problemet er langt t�ttere p�
dig end YAML-modulet, derfor pr�vede jeg at blande det udenom indtil vi
har det p� det rene.
Mvh.
--
"No more than that, but very powerful all the same; Adam Sj�gren
simple things are good." as...@koldfront.dk
binmode p� FILE, intet andet nu :-)
$ perl test_suite/load_7bit.pl
?
$ perl test_suite/load_7bit.pl | hexdump
0000000 0afc 0a0a
0000004
Ingen binmode overhovedet:
$ perl test_suite/load_7bit.pl
�
Aha :-)
Jeg tror du fandt l�sningen!
Tak, jeg ser om det giver andre problemer at fjerne det overalt!