2010-08-14 6 views
8

Je voudrais écrire un script Ruby qui écrit des caractères japonais sur la console. Par exemple:Caractères Unicode dans un script Ruby?

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

Cependant, je reçois une exception lors de l'exécution il:

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

Est-il possible de faire? J'utilise Ruby 1.8.6.

Répondre

12

Vous avez sauvegardé le fichier dans l'encodage UTF-16LE, celui que Windows appelle trompeusement "Unicode". Il est généralement préférable d'éviter ce codage car ce n'est pas un sur-ensemble ASCII: chaque unité de code est stockée sous la forme de deux octets, les caractères ASCII ayant l'autre octet sous la forme \0. Cela va confondre énormément de logiciels; il est inhabituel d'utiliser UTF-16 pour le stockage de fichiers.

Ce que vous voyez avec \377 et \376 (octal pour \xFF et \xFE) est le U + FEFF Byte Order Mark séquence mis à l'avant des fichiers UTF-16 pour distinguer UTF-16LE UTF-16BE.

Ruby 1.8 est totalement basé sur les octets; il ne tente pas de lire les caractères Unicode à partir d'un script. Vous ne pouvez donc enregistrer que les fichiers source dans des encodages compatibles ASCII. Normalement, vous voudriez sauvegarder vos fichiers en UTF-8 (sans BOM, le faux-BOM UTF-8 est une autre innovation de Microsoft qui brise tout). Cela fonctionnerait bien pour les scripts sur le web produisant des pages UTF-8.

Et si vous voulez être sûr que le code source serait tolérant d'être sauvé dans un encodage compatible ASCII, vous pouvez encoder la chaîne pour la rendre plus élastique (si moins lisible):

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" 

Toutefois! Ecrire sur la console est en soi un gros problème. Le codage utilisé pour envoyer des caractères à la console varie d'une plateforme à l'autre. Sous Linux ou OS X, c'est UTF-8. Sous Windows, l'encodage est différent pour chaque environnement local d'installation (sélectionné dans "Langue pour les applications non Unicode" dans l'entrée "Options régionales et linguistiques" du panneau de configuration), mais jamais UTF-8. Ce paramètre est, encore une fois, trompeusement connu sous le nom de page de code ANSI. Par conséquent, si vous utilisez une installation Windows japonaise, l'encodage de votre console sera la page de codes Windows 932 (une variante de Shift-JIS). Si tel est le cas, vous pouvez enregistrer le fichier texte à partir d'un éditeur de texte en utilisant "ANSI" ou explicitement "cp932 japonais", et lorsque vous l'exécutez dans Ruby vous obtiendrez les bons caractères. Encore une fois, si vous voulez faire la source de tenue misencoding, vous pouvez échapper à la chaîne dans le codage de CP932:

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

Mais si vous l'exécutez sur une machine locale dans un autre, il va produire des caractères différents. Vous ne pourrez pas écrire japonais sur la console par défaut à partir de Ruby sur une installation Windows occidentale (code page 1252). Bien que Ruby 1.9 améliore considérablement la gestion d'Unicode, il ne change rien ici, il s'agit toujours d'une application basée sur des octets utilisant les fonctions IO de la bibliothèque standard C, ce qui signifie qu'elle est limitée à la page de codes locale de Windows.

+3

c'est l'homme unicode en action – mykhal

Questions connexes