2010-08-14 6 views
8

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

puts "こんにちは・今日は" 

Allerdings erhalte ich eine Ausnahme, wenn es ausgeführt wird:

jap.rb:1: Invalid char `\377' in expression 
jap.rb:1: Invalid char `\376' in expression 

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

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 \0 gespeichert haben. Dies wird eine Menge Software verwechseln. Es ist ungewöhnlich, UTF-16 als Dateispeicher zu verwenden.

Was Sie mit \377 und \376 (Oktal für \xFF und \xFE) ist die U + FEFF Byte Order Mark-Sequenz an der Vorderseite der UTF-16-Dateien setzen sehen UTF-16LE von UTF-16 BE zu unterscheiden.

Ruby 1.8 ist vollständig Byte-basiert; 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). Dies wäre großartig für Scripts im Web, die UTF-8-Seiten produzieren.

Und wenn Sie der Quellcode sicher sein wollen, in einer beliebigen ASCII-kompatible Codierung gespeichert worden tolerant sein würde, könnten Sie die Zeichenfolge kodieren, um es elastisch (wenn weniger lesbar):

puts "\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe3\x83\xbb\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf" 

Jedoch! 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 ist - wiederum irreführend - als ANSI-Codepage bekannt.

Wenn Sie also eine japanische Windows-Installation verwenden, wird die Konsolencodierung Windows-Codepage 932 (eine Variante von Shift-JIS) sein. 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. Noch einmal, wenn Sie die Quelle standhalten misencoding machen möchten, können Sie die Zeichenfolge in cp932 Codierung entkommen:

puts "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd\x81E\x8d\xa1\x93\xfa\x82\xcd" 

Aber wenn Sie es auf einer Maschine in einem anderen Gebietsschema ausführen, werden sie verschiedene Charaktere erzeugen. Sie können auf einer westlichen Windows-Installation (Codepage 1252) von Ruby aus kein Japanisch in die Standardkonsole schreiben.

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

+3

das ist unicode man in action – mykhal

Verwandte Themen