Frage

Ausführen des folgenden Befehls

perl -e "for (my $i = 0; $i < length($ARGV[0]); $i++) {print ord(substr($ARGV[0], $i, 1)), qq{\n}; }" αβγδεζ

In einem Windows 7 -CMD -Fenster mit Activestate Perl v5.14.2 erzeugt das folgende Ergebnis:

97
223
63
100
101
63

Die obigen Werte sind unsinnig und entsprechen keiner bekannten Codierung.Wie kann ich Befehlszeilenargumente als UTF-8 in Perl behandeln? Hilft nicht. Das Ändern des aktiven Codeseite des Befehlsfensters ändert die Ergebnisse nicht.

War es hilfreich?

Lösung

Ihr System verwendet wie jedes Windows -System, das ich kenne

use Encode qw( decode );
@ARGV = map { decode('cp1252', $_) } @ARGV;

Beachten Sie, dass CP1252 nicht alle diese Zeichen darstellen können, weshalb die Konsole und damit Perl tatsächlich tatsächlich empfangen

  • A 97
  • ß 223
  • ? 63
  • D 100
  • E 101
  • ? 63

Es gibt eine "breite" Schnittstelle zum Übergeben (fast) jeder Unicode -Code, der auf ein Programm hinweist, aber

  1. Die breite Schnittstelle wird nicht verwendet, wenn Sie einen Befehl an der Eingabeaufforderung eingeben.
  2. Perl verwendet die ANSI -Schnittstelle, um die Parameter abzurufen. Selbst wenn Sie Perl mithilfe der breiten Schnittstelle gestartet haben, werden die Parameter auf ANSI herabgestuft, wenn Perl sie abruft.

Entschuldigung, aber dies ist eine Art "Sie können" -Stype. Sie brauchen einen anderen Ansatz. Diomidis spinellis schlägt vor, die ANSI -Code -Seite Ihres Systems wie folgt zu ändern:

  1. Schalttafel
  2. Region und Sprache
  3. Administrativ
  4. Sprache für Nicht-Unicode-Programme
  5. Legen Sie die aktuelle Sprache für Nicht-Unicode-Programme auf die Sprache ein, die den spezifischen Zeichen (griechisch in Ihrem Fall) zugeordnet ist.

Zu diesem Zeitpunkt würden Sie die Codierung der ANSI -Code -Seite verwenden, die der neu ausgewählten Kodierung anstelle von zugeordnet ist cp1252 (cp1253 für Griechisch).

use Encode qw( decode );
@ARGV = map { decode('cp1253', $_) } @ARGV;

Beachten Sie, dass die Verwendung von chcp Um die im Konsolenfenster verwendete Codeseite zu ändern, wirkt sich nicht auf die Code -Seite aus, auf der Perl seine Argumente empfängt, was immer eine ANSI -Code -Seite ist. Siehe die folgenden Beispiele (CP737 ist das Griechische OEM -Code -Seite, und CP1253 ist das Griechische ANSI -Code -Seite. Sie können die als 37 und M7 in gekennzeichneten Engpässe finden dieses Dokument.)

C:\>chcp 737
Active code page: 737

C:\>echo αβγδεζ | od -t x1
0000000 98 99 9a 9b 9c 9d 20 0d 0a

C:\>perl -e "print map sprintf('%x ', ord($_)), split(//, $ARGV[0])" αβγδεζ
e1 e2 e3 e4 e5 e6

C:\>chcp 1253
Active code page: 1253

C:\>echo αβγδεζ | od -t x1
0000000 e1 e2 e3 e4 e5 e6 20 0d 0a

C:\>perl -e "print map sprintf('%x ', ord($_)), split(//, $ARGV[0])" αβγδεζ
e1 e2 e3 e4 e5 e6

Andere Tipps

Dies funktionierte für mich (unter OS-X, sollte aber tragbar sein):

echo  αβγδεζ |perl -CI -e "chomp($in=<STDIN>);for (my $i = 0; $i < length($in); $i++) {print ord(substr($in, $i, 1)), qq{\n}; }"

Das war für Stdin; für argv:

perl -CA -e "for (my $i = 0; $i < length($ARGV[0]); $i++) {print ord(substr($ARGV[0], $i, 1)), qq{\n}; }" αβγδεζ

Siehe das -C Option in Perlrun: http://perldoc.perl.org/perlrun.html#command-Switches

Wenn ich die Zeichen in einer Datei (von OS-X) platziere, kopieren Sie sie in ein Windows-Feld (als file.txt), dann renne:

perl -CI -e "chomp($_=<STDIN>); map{print ord, qq{\n}} split(//)" < file.txt

Dann bekomme ich das erwartete:

946
947
948
949
950

Aber wenn ich den Inhalt von kopiere file.txt In der Befehlszeile bekomme ich Kauderwelsch.

Wie @ikegami sagte, denke ich nicht, dass es möglich ist, aus der Befehlszeile zu tun, da Sie kein UTF-8-Gebietsschema haben.

Sie könnten versuchen, es zu verwenden https://metacpan.org/pod/win32::unicode::native. Es sollte das haben, was Sie brauchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top