Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

YAML - UTF-8 ?!?

8 views
Skip to first unread message

Morten P

unread,
Jun 20, 2009, 4:18:54 PM6/20/09
to
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.

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> });
}


Adam Sjøgren

unread,
Jun 20, 2009, 4:30:56 PM6/20/09
to
On Sat, 20 Jun 2009 22:18:54 +0200, Morten wrote:

> 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

Morten P

unread,
Jun 20, 2009, 4:40:40 PM6/20/09
to
> Har du sat din locale m�rkeligt op? Kan du ikke pr�ve at vise et

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...


Adam Sjøgren

unread,
Jun 20, 2009, 5:14:42 PM6/20/09
to
On Sat, 20 Jun 2009 22:40:40 +0200, Morten wrote:

> #!/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

Morten P

unread,
Jun 20, 2009, 5:21:56 PM6/20/09
to

"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:
>
>> #!/usr/bin/perl
>
>> binmode ('STDOUT', ':utf8');
>
> Hvorfor s�tter du den?

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.


Morten P

unread,
Jun 20, 2009, 5:25:10 PM6/20/09
to
>>> binmode ('STDOUT', ':utf8');
>>
>> Hvorfor s�tter du den?

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

unread,
Jun 20, 2009, 5:32:08 PM6/20/09
to
On Sat, 20 Jun 2009 23:21:56 +0200, Morten wrote:

> "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

Adam Sjøgren

unread,
Jun 20, 2009, 5:34:37 PM6/20/09
to
On Sat, 20 Jun 2009 23:25:10 +0200, Morten wrote:

> 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

Morten P

unread,
Jun 20, 2009, 5:37:18 PM6/20/09
to

> Du viste ikke hvad der sker n�r du fjerner den?

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!


0 new messages