Ich versuche, ein Perl-Skript mit dem Pragma "utf8" zu schreiben, und erhalte unerwartete Ergebnisse. Ich verwende Mac OS X 10.5 (Leopard) und bearbeite mit TextMate. Alle meine Einstellungen für Editor und Betriebssystem sind standardmäßig auf das Schreiben von Dateien im utf-8-Format eingestellt.
Wenn ich jedoch Folgendes in eine Textdatei eingebe, sie als ".pl" speichere und ausführe, wird anstelle der Nicht-ASCII-Zeichen die angezeigte "Raute mit einem Fragezeichen" angezeigt.
#!/usr/bin/env Perl -w
use strict;
use utf8;
my $str = 'Çirçös';
print( "$str\n" );
Irgendeine Idee, was ich falsch mache? Ich erwarte, "Çirçös" in der Ausgabe zu erhalten, aber ich erhalte stattdessen "�ir�s".
use utf8;
Aktiviert Unicode nicht Ausgabe - Sie können Unicode in Ihr Programm eingeben. Fügen Sie dies vor Ihrer print()
-Anweisung zum Programm hinzu:
binmode(STDOUT, ":utf8");
Mal sehen, ob das hilft. Das sollte STDOUT
in UTF-8 anstelle von normalem ASCII ausgeben.
Sie können das offenes Pragma verwenden.
Zum Beispiel. Im Folgenden werden STDOUT, STDIN und STDERR für die Verwendung von UTF-8 festgelegt.
use open qw/:std :utf8/;
TMTOWTDI , wählte die Methode, die am besten zu Ihrer Arbeitsweise passt. Ich benutze die Umgebungsmethode, damit ich nicht darüber nachdenken muss.
In der mgebung :
export Perl_UNICODE=SDL
in der Befehlszeile :
Perl -CSDL -le 'print "\x{1815}"';
oder mit binmode :
binmode(STDOUT, ":utf8"); #treat as if it is UTF-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8
oder mit PerlIO :
open my $fh, ">:utf8", $filename
or die "could not open $filename: $!\n";
open my $fh, "<:encoding(utf-8)", $filename
or die "could not open $filename: $!\n";
oder mit dem offenes Pragma :
use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";
Sie möchten auch sagen, dass Zeichenfolgen in Ihrem Code utf-8 sind. Siehe Warum vermeidet modernes Perl standardmäßig UTF-8? . Also setze nicht nur Perl_UNICODE=SDAL
aber auch Perl5OPT=-Mutf8
.
Danke, habe endlich eine Lösung gefunden, um utf8 :: encode nicht komplett über den Code zu ziehen. Zu synthetisieren und für andere Fälle zu vervollständigen, wie das Schreiben und Lesen von Dateien in utf8 und funktioniert auch mit LoadFile einer YAML-Datei in utf8
use utf8;
use open ':encoding(utf8)';
binmode(STDOUT, ":utf8");
open(FH, ">test.txt");
print FH "something éá";
use YAML qw(LoadFile Dump);
my $PUBS = LoadFile("cache.yaml");
my $f = "2917";
my $ref = $PUBS->{$f};
print "$f \"".$ref->{name}."\" ". $ref->{primary_uri}." ";
dabei ist cache.yaml:
---
2917:
id: 2917
name: Semanário
primary_uri: 2917.xml