caractère multi-octets invalide (US-ASCII) avec Rails et Ruby 1.9

197

J'utilise Ruby 1.9.1 avec Rails 2.3.4 Mon application est de gérer la saisie de texte

Si j'essaye quelque chose comme (les guillemets intérieurs sont différents)

text = "”“"

J'obtiens l'erreur suivante:

#<SyntaxError: /Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: syntax error, unexpected $end, expecting keyword_end

Je dois utiliser ces guillemets car les utilisateurs peuvent les saisir et je dois en tenir compte?

Des idées?

Tam
la source
Si votre code ne contient pas de backticks mais que vous êtes "accusé" d'utiliser des backticks, il peut y avoir des problèmes d'espacement / tabulations / nouvelle ligne étranges dans votre fichier. Essayez de le publier dans un espace StackOverflow par exemple, et SO commencera à agir bizarrement. Supprimez les espaces et les tabulations étranges et les retours à la ligne. Encore une fois, simplement coller le code dans un espace vierge et essayer de formater votre code pour la présentation est un moyen de vous donner un indice.
boulder_ruby

Réponses:

691

Avez-vous essayé d'ajouter un commentaire magique dans le script où vous utilisez des caractères non ASCII? Il devrait aller au-dessus du script.

#!/bin/env ruby
# encoding: utf-8

Cela a fonctionné pour moi comme un charme.

Jarek Zmudzinski
la source
2
Hmm ......... a ajouté cela en haut du fichier mais obtient toujours le même message d'erreur. Aucune suggestion?
Artem Kalinchuk
8
L'explication centrale se trouve dans l'article lié @dalyons: les fichiers source reçoivent un encodage US-ASCII, sauf indication contraire. Si vous placez du contenu non ASCII dans un littéral de chaîne sans changer le codage source, Ruby mourra avec cette erreur. Merci les gars, j'ai enfin compris :-)
bass-t
2
#!/bin/env rubyn'est pas nécessaire sauf si vous exécutez le script à partir de la ligne de commande en tant qu'exécutable. La # encodingligne fonctionne d'elle-même.
gak
10
# encoding: utf-8. C'est fin 2013 et nous devons encore jouer à ce jeu. Attendez, le téléphone sonne ... C'était en 2033, ils ont appelé pour dire qu'ils jouaient toujours. Eh bien, merci de me le rappeler, Jarek Zmudzinski de 2010.
thomax
1
@gotqn - Veuillez trouver le même article ici - graysoftinc.com/character-encodings/…
Alok Swain
43

Si vous souhaitez ajouter facilement des commentaires magiques sur tous les fichiers source d'un projet, vous pouvez utiliser la magic_encodinggemme

sudo gem install magic_encoding

puis appelez simplement magic_encodingle terminal depuis la racine de votre application.

Shamu
la source
Je pense qu'il est important de se rappeler ce genre de détails, donc je n'utiliserais pas ce joyau pendant au moins quelques mois d'écriture # encoding: utf-8 manuellement.
Marcel Valdez Orozco
l'ajout de 'gem magic_encoding' au gemfile sur les rails 2.3 et ruby ​​1.9 a aidé
Elmor
cela ne s'intègre pas dans les tests de concombre.
Voyage
1
@Elmor Vous ne devriez jamais mettre des bibliothèques externes dans le Gemfile de votre projet comme ça. magic_encodingest juste un outil en ligne de commande, pas une dépendance de projet.
Nowaker
17

Je veux juste ajouter ma solution:

j'utilise des trémas allemands comme ö, ü, ä et j'ai la même erreur.
@Jarek Zmudzinski vient de vous expliquer comment cela fonctionne, mais voici le mien:

Ajoutez ce code en haut de votre Controller: # encoding: UTF-8
(par exemple pour utiliser un message flash avec des trémas)

exemple de mon contrôleur:

# encoding: UTF-8
class UserController < ApplicationController

Vous pouvez maintenant utiliser ö, ä, ü, ß, "", etc.

Ismoh
la source
8

Ces guillemets doubles inclinés ne sont pas des caractères ASCII. Le message d'erreur est trompeur sur le fait qu'ils sont «multi-octets».

Phil Miller
la source
2
Pourquoi est-ce trompeur? Ce sont des caractères multi - octets.
Matthew Scharley
4
Parce que ASCII ne définit aucun codage multi-octets. En ce qui concerne l'ASCII, ce sont du charabia, qui se trouve être valide dans un codage connexe.
Phil Miller
8

Juste une note qu'à partir de Ruby 2.0, il n'est pas nécessaire d'ajouter # encoding: utf-8. UTF-8 est automatiquement détecté.

Nowaker
la source
8

Cela a fonctionné pour moi:

$ export LC_ALL=en_US.UTF-8
$ export LANG=en_US.UTF-8
cassioscabral
la source