Unicode-Zeichen in einem Ruby-Skript?

8

Ich möchte ein Ruby-Skript schreiben, das japanische Zeichen in die Konsole schreibt. Zum Beispiel:

%Vor%

Ich erhalte jedoch eine Ausnahme beim Ausführen:

%Vor%

Ist es möglich zu tun? Ich benutze Ruby 1.8.6.

    
Shay Friedman 14.08.2010, 15:57
quelle

1 Antwort

12

Sie haben die Datei in der UTF-16LE-Codierung gespeichert, die Windows fälschlicherweise als "Unicode" bezeichnet. Diese Codierung wird im Allgemeinen am besten vermieden, da es sich nicht um eine ASCII-Obermenge handelt: Jede Codeeinheit wird als zwei Bytes gespeichert, wobei ASCII-Zeichen das andere Byte als 7 gespeichert haben. Dies wird eine Menge Software verwechseln. Es ist ungewöhnlich, UTF-16 für die Speicherung von Dateien zu verwenden.

Was Sie mit 6 und \xFF (oktal für \xFE und %code% ) sehen, ist die U + FEFF Byte Order Mark-Sequenz, die an der Vorderseite von UTF-16-Dateien steht, um UTF-16LE von zu unterscheiden UTF-16BE.

Ruby 1.8 ist vollständig bytebasiert; Es wird nicht versucht, Unicode-Zeichen aus einem Skript zu lesen. Sie können also Quelldateien nur in ASCII-kompatiblen Kodierungen speichern. Normalerweise möchten Sie Ihre Dateien als UTF-8 speichern (ohne BOM; die UTF-8 Faux-BOM ist eine weitere großartige Microsoft-Innovation, die alles kaputt macht). Das wäre großartig für Scripts im Web, die UTF-8-Seiten produzieren.

Und wenn Sie sichergehen wollen, dass der Quellcode in jeder ASCII-kompatiblen Codierung gespeichert werden kann, könnten Sie die Zeichenfolge codieren, um sie widerstandsfähiger zu machen (wenn sie weniger lesbar ist):

%Vor%

Aber! Schreiben auf die Konsole ist selbst ein großes Problem. Welche Codierung zum Senden von Zeichen an die Konsole verwendet wird, ist von Plattform zu Plattform unterschiedlich. Unter Linux oder OS X ist es UTF-8. Unter Windows ist es eine andere Codierung für jedes Installationsgebietsschema (wie unter "Sprache für Nicht-Unicode-Anwendungen" im Kontrollfeld "Regions- und Sprachoptionen" ausgewählt), aber es ist nie UTF-8. Diese Einstellung wird - wiederum irreführend - als ANSI-Codepage bezeichnet.

Wenn Sie also eine japanische Windows-Installation verwenden, lautet Ihre Konsolencodierung Windows-Codepage 932 (eine Variante von Shift-JIS). Wenn das der Fall ist, können Sie die Textdatei mit "ANSI" oder explizit "Japanese cp932" aus einem Texteditor speichern, und wenn Sie sie in Ruby ausführen, werden die richtigen Zeichen ausgegeben. Wenn Sie die Quelle erneut der Fehlanpassung aussetzen wollen, können Sie die Zeichenfolge in der cp932-Kodierung umgehen:

%Vor%

Aber wenn Sie es auf einem Computer in einem anderen Gebietsschema ausführen, wird es verschiedene Zeichen produzieren. Sie können Japanisch nicht in die Standardkonsole von Ruby auf einer westlichen Windows-Installation (Codepage 1252) schreiben.

(Während Ruby 1.9 die Unicode-Behandlung sehr verbessert, ändert es hier nichts. Es ist immer noch eine bytesbasierte Anwendung, die die C-Standard-Bibliotheks-IO-Funktionen verwendet, und das bedeutet, dass es auf die lokale Windows-Codepage beschränkt ist.)

    
bobince 14.08.2010, 16:19
quelle

Tags und Links