[librecat-dev] Problem mit Encoding in PICA:Writer
Rolschewski, Johann
Johann.Rolschewski at sbb.spk-berlin.de
Fri Nov 24 15:14:19 CET 2017
Hi Cornelius,
das Encoding-Problem bereitet Config::IniFiles, die Daten werden beim Einlesen nicht dekodiert, wie Du der Ausgabe von Devel::Peek entnehmen kannst: $value fehlt der UTF8-FLAG. Wenn Du die Werte
aus der Config mit Encode dekodierst funktioniert es. Verwende beim Einlesen und Ausgeben von Dateien möglichst einen entsprechenden IO-Layer.
#!/usr/bin/perl
use strict;
use utf8;
use warnings;
use feature qw(say);
use Config::IniFiles;
use PICA::Record;
use PICA::Writer;
use PICA::Field;
use Encode qw(encode decode);
use Devel::Peek;
my $config = Config::IniFiles->new(
-file => "test.ini",
-default => 'General'
);
my $value = $config->val( 'General', 'param' );
my $value2 = $config->val( 'General', 'param2' );
my $value3 = 'äüöß';
# dump a raw Perl datatype
Dump $value;
Dump $value3;
# Ausgabe in Datei klappt *nicht*
open( my $fh, '>', 'output.txt' );
say $fh $value;
say $fh $value3;
close $fh;
say "RAW file written";
# Ausgabe in UTF8-Datei klappt nicht, siehe zweite Zeile
open( my $fhutf8, '>:encoding(UTF-8)', 'output_utf8.txt' );
say $fhutf8 "# raw value from Config";
say $fhutf8 $value;
say $fhutf8 "# decoded value from Config";
say $fhutf8 decode( 'UTF-8', $value );
say $fhutf8 "# UTF-8 value";
say $fhutf8 'äüöß';
close $fh;
say "UTF-8 file written";
# Ausgabe im PICA::Writer klappt nicht, Umlaute sind kaputt.
my $writer = PICA::Writer->new( 'out.pica', format => 'normalized' );
my $field = new PICA::Field('021A');
my $record = new PICA::Record();
$field->add( 'a', $value );
$field->add( 'y', decode( 'UTF-8', $value ) );
$field->add( 'x', 'äüöß' );
$record->append($field);
$writer->write( '', $record );
$writer->end();
say "Pica file written";
Das Module PICA::Record ist "deprecated", ich empfehle die Verwendung von PICA::Data oder Catmandu::PICA. Wenn Du Fragen hast, melde Dich.
Schönes Wochenende,
Johann
> -----Ursprüngliche Nachricht-----
> Von: librecat-dev-bounces at lists.uni-bielefeld.de [mailto:librecat-dev-
> bounces at lists.uni-bielefeld.de] Im Auftrag von Cornelius Amzar
> Gesendet: Freitag, 24. November 2017 13:30
> An: librecat-dev at lists.uni-bielefeld.de
> Cc: Abedini, Tayyebeh <tayyebeh.abedini at bsz-bw.de>
> Betreff: [librecat-dev] Problem mit Encoding in PICA:Writer
>
> Guten Tag,
>
> ich benutze zwar kein LibreCat/Catmandu, aber die zugrunde liegenden Perl-
> Module. Herr Voß vom GBV meinte, dass ich hier Hilfe bekommen könnte.
>
>
> Ich habe das Problem, dass Inhalte aus einer INI-Datei zwar richtig in die
> Konsole und auch in Dateien geschrieben werden, aber nicht wenn ich
> PICA::Writer einsetze.
>
>
> Laut Herrn Voß liegt das daran, dass PICA::Writer intern mit Bytestrings
> arbeitet. Trotz zahlloser Versuche habe ich es nicht geschafft, diese Werte
> entsprechend an PICA::Writer zu übergeben. Finde dazu auch in der
> Dokumentation keine Hinweise, aber die scheint eh nicht so aktuell zu sein....
>
>
> Sowohl die Perl-Dateien, als auch die Daten sind utf8 kodiert.
>
>
> Ein Beispielskript finden Sie unten, die Testdaten sind im Anhang.
>
>
> Wäre toll, wenn jemand eine Idee hat.
>
>
> Viele Grüße,
>
> Cornelius Amzar
>
>
> #!/usr/bin/perl
> #
>
> use strict;
> use utf8;
> use warnings;
> use feature qw(say);
> use Config::IniFiles;
>
> use PICA::Record;
> use PICA::Writer;
> use PICA::Field;
>
> my $config = Config::IniFiles->new( -file => "tests/test.ini",
> -default => 'General');
> my $writer = PICA::Writer->new('tests/out.pica', format => 'normalized');
> my $field = new PICA::Field('021A');
> my $record = new PICA::Record();
>
> my $value = $config->val('General', 'param'); my $value2 = $config-
> >val('General', 'param2');
>
>
> # Ausgabe im Terminal klappt
>
> say $value;
> say $value2;
>
> # Ausgabe in Datei klappt
>
>
> open(my $fh, '>', output.txt');
> say $fh $value;
> close $fh;
>
> # Ausgabe im PICA::Writer klappt nicht, Umlaute sind kaputt.
>
>
> $field->add('a', $value);
> $field->add('d', $value2);
> $field->add('x', 'test');
>
> $record->appendif($field);
>
> $writer->write('', $record);
> $writer->write('', $record);
> $writer->end();
>
> say "Pica file written";
>
>
> --
>
>
> Cornelius Amzar
> Bibliotheksservice-Zentrum Baden-Württemberg (BSZ)
> 78457 Konstanz / Germany
> E-Mail: cornelius.amzar at bsz-bw.de <mailto:cornelius.amzar at bsz-bw.de>
> http://www.bsz-bw.de
More information about the librecat-dev
mailing list