2015-08-27 18 views
10

Bitte lassen Sie mich zuerst feststellen, dass dieses Problem eng mit dem Perl Diamant Operator Annahme von Eingaben, die direkt auf der Tastatur eingegeben wurde.Umlaute Zeichen nicht über Tastatur (Codepage 65001, UTF-8) von Perl Skript

Hätte ich über den perl diamond-Operator gesprochen, der eine Eingabe akzeptiert, die von Text aus einer Datei piped oder anderweitig stammt, dann wäre das ein Duplikat der Frage 519309 - How do I read Utf-8 with diamond operator.

Es geht jedoch nicht um Piped- oder Dateidaten, sondern um Eingaben, die direkt auf der Tastatur eingegeben wurden. Deshalb habe ich argumentieren, ist diese Frage nicht ein Duplikat 519309.

Hier werden die Details meiner Frage sind:

ich Umlaute versuche zu verwenden (‚ä‘, ‚ö‘, ‚ü‘, ...) auf meiner Tastatur.

Ich habe einen sehr einfachen Perl-Skript, das eine Linie von der Tastatur akzeptiert und dann druckt ihn sofort wieder heraus zu Bildschirm:

Wenn ich Umlaute mit Codepage 1252 verwenden, dann funktioniert alles wie erwartet:

C:\>chcp 1252 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;" 
Page de codes active : 1252 
*** ü 
--- ü 

Allerdings, wenn ich die gleichen Umlaute mit Codepage 65001 (UTF-8) verwenden, dann bekomme ich eine Warnung nicht initialisierten Wert und der Umlaut nicht akzeptiert wird:

C:\>chcp 65001 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;" 
Page de codes active : 65001 
*** ü 
Use of uninitialized value $txt in print at -e line 1. 
--- 

Wenn ich Pfeife des Umlaut in mein Perl-Programm, dann habe ich kein Problem:

C:\>chcp 65001 & echo ü | perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;" 
Page de codes active : 65001 
*** --- ü 

Warum erhalte ich diese Warnung mit Codepage 65001 (UTF-8)?

Ich benutze Windows 7 x64, mit Strawberry Perl 5.22.

Nur für den Datensatz, wenn ich reine Batch-Befehle verwenden (das ist ich nicht perl verwenden), kann ich erfolgreich umlaut Zeichen mit Codepage 65001 (UTF-8) eingeben.

C:\>chcp 65001 & set /p txt=*** & echo --- %txt% 
Page de codes active : 65001 
*** ü 
--- ü 

Die Frage ist wirklich: Warum ist Perl nicht in der Lage Umlaut per Tastatur mit Codepage 65001, während der gleichen Tastatureingabe, gleiche Codepage 65001, arbeitet ok als reiner DOS-Batch-Befehl zu akzeptieren?

Es scheint etwas grundsätzlich anders zu sein zwischen Umlauten und Umlauten direkt von der Tastatur.

Warum funktioniert die Eingabe eines Umlautzeichens auf der Tastatur nicht, während das Gleiche wie ein Piped-Zeichen einwandfrei funktioniert?

+0

Haben Sie die Option '-CS' ausprobiert? ('perl -CS -we') um STDIN und STDOUT UTF-8 Kodierung zu verwenden –

+0

Ich habe versucht perl -CS -we - das funktioniert perfekt für den Ausdruck auf STDOUT, aber aus irgendeinem Grund hat es keine Wirkung auf STDIN (Das heißt: Ich habe immer noch genau das gleiche Problem - nicht initialisierter Wert) – user2288349

+1

'CHCP 65001' utf-8 Unterstützung in cmd ist fadenscheinig, wenn es mit externen Anwendungen wie' perl' verwendet wird. Das ist, wo Wrapper wie ConEmu praktisch sind. – wOxxOm

Antwort

2

Versuchen Konsolen-Schriftart zu ändern, um "Lucida Console"

Sie können auch versuchen chcp 65001 in der Konsole auszuführen. Dieser Befehl setzt Zeichen auf UTF-8

Wenn Sie falsch angezeigt werden - installieren Sie die erforderliche Schriftart in das System.

Mehr Details here

Eigentlich ist das Problem gehört nicht Perl.Es gehört zum Windows-Terminal. Versuchen Sie, wie es in this console funktioniert. Sie können auf einige Datei binäre Daten protokollieren, die aus der Eingabe gelesen wurden, und diese beiden Fälle vergleichen (Terminal VS cygwin)

1

Dies ist ein Microsoft-Fehler. Die Windows-APIs ReadFile() und ReadConsoleA() geben auf der Codepage 65001 immer 0 Byte (das EOF angibt) zurück. Weitere Informationen finden Sie unter this blog.
Da Microsoft dies nicht beheben kann, besteht die einzige verfügbare Antwort darin, den Perl-Betreuern zu sagen, dass sie ReadConsoleW() verwenden und die resultierenden Wide-Zeichen mit WideCharToMultiByte (CP_UTF8, ...) in utf-8 konvertieren sollen.

Verwandte Themen