ungültiges Multibyte-Zeichen (US-ASCII) mit Rails und Ruby 1.9

197

Ich verwende Ruby 1.9.1 mit Rails 2.3.4. Meine Anwendung ist die Texteingabe

Wenn ich so etwas versuche (die inneren Anführungszeichen sehen anders aus)

text = "”“"

Ich erhalte folgende Fehlermeldung:

#<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

Ich muss diese Anführungszeichen verwenden, wenn Benutzer sie eingeben, und ich muss das berücksichtigen.

Irgendwelche Ideen?

Tam
quelle
Wenn Ihr Code keine Backticks enthält, Sie jedoch "beschuldigt" werden, Backticks zu verwenden, enthält Ihre Datei möglicherweise seltsame Probleme mit Abständen / Tabulatoren / Zeilenumbrüchen. Versuchen Sie beispielsweise, es in einem StackOverflow-Leerzeichen zu veröffentlichen, und SO wird sich merkwürdig verhalten. Entfernen Sie die seltsamen Leerzeichen, Tabulatoren und Zeilenumbrüche. Auch hier ist es eine Möglichkeit, sich einen Hinweis zu geben, wenn Sie den Code einfach in ein SO-Leerzeichen einfügen und versuchen, Ihren Code für die Präsentation zu formatieren.
boulder_ruby

Antworten:

691

Haben Sie versucht, dem Skript einen magischen Kommentar hinzuzufügen, in dem Sie Nicht-ASCII-Zeichen verwenden? Es sollte über dem Skript stehen.

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

Es hat bei mir wie ein Zauber funktioniert.

Jarek Zmudzinski
quelle
2
Hmm ......... hat das oben in der Datei hinzugefügt, aber immer noch die gleiche Fehlermeldung erhalten. Irgendwelche Vorschläge?
Artem Kalinchuk
8
Die zentrale Erklärung finden Sie im Artikel @dalyons linked: Quelldateien erhalten eine US-ASCII-Codierung, sofern Sie nichts anderes angeben. Wenn Sie Nicht-ASCII-Inhalte in ein String-Literal einfügen, ohne die Quellcodierung zu ändern, stirbt Ruby mit diesem Fehler. Danke Jungs, ich habe es endlich verstanden :-)
Bass-t
2
#!/bin/env rubyist nur erforderlich, wenn Sie das Skript über die Befehlszeile als ausführbare Datei ausführen. Die # encodingLinie funktioniert von selbst.
Gak
10
# encoding: utf-8. Es ist Ende 2013 und wir müssen dieses Spiel noch spielen. Warte, Telefon klingelt ... Es war 2033, sie riefen an und sagten, sie spielen es immer noch. Na ja, danke, dass du mich daran erinnert hast, Jarek Zmudzinski von 2010.
Thomax
1
@gotqn - Bitte finden Sie den gleichen Artikel hier - graysoftinc.com/character-encodings/…
Alok Swain
43

Wenn Sie einfach magische Kommentare zu allen Quelldateien eines Projekts hinzufügen möchten, können Sie das magic_encodingJuwel verwenden

sudo gem install magic_encoding

Rufen Sie dann einfach magic_encodingdas Terminal vom Stammverzeichnis Ihrer App aus auf.

Shamu
quelle
Ich denke, es ist wichtig, sich an diese Art von Details zu erinnern, damit ich dieses Juwel nicht für mindestens ein paar Monate verwenden würde, um # encoding: utf-8 manuell zu schreiben.
Marcel Valdez Orozco
Das Hinzufügen von 'gem magic_encoding' zu gemfile on Rails 2.3 & ruby ​​1.9 hat geholfen
Elmor
Dies lässt sich nicht in Gurkentests integrieren.
Reise
1
@Elmor Sie sollten niemals externe Bibliotheken so in die Gemfile Ihres Projekts einfügen. magic_encodingist nur ein Befehlszeilenprogramm, keine Projektabhängigkeit.
Nowaker
17

Ich möchte nur meine Lösung hinzufügen:

Ich verwende deutsche Umlaute wie ö, ü, ä und habe den gleichen Fehler erhalten.
@Jarek Zmudzinski hat dir gerade gesagt, wie es funktioniert, aber hier ist meins:

Fügen Sie diesen Code oben auf Ihrem Controller hinzu: # encoding: UTF-8
(zum Beispiel, um eine Flash-Nachricht mit Umlauten zu verwenden)

Beispiel meines Controllers:

# encoding: UTF-8
class UserController < ApplicationController

Jetzt können Sie ö, ä, ü, ß, "" usw. verwenden.

Ismoh
quelle
8

Diese schrägen doppelten Anführungszeichen sind keine ASCII-Zeichen. Die Fehlermeldung ist irreführend, wenn es sich um "Multi-Byte" handelt.

Phil Miller
quelle
2
Warum ist es irreführend? Sie sind Multibyte-Zeichen.
Matthew Scharley
4
Weil ASCII keine Mehrbyte-Codierungen definiert. Was ASCII betrifft, so handelt es sich um Kauderwelsch, der in einer verwandten Codierung gültig ist.
Phil Miller
8

Nur eine Anmerkung, die ab Ruby 2.0 nicht mehr hinzugefügt werden muss # encoding: utf-8. UTF-8 wird automatisch erkannt.

Nowaker
quelle
7

Das hat bei mir funktioniert:

$ export LC_ALL=en_US.UTF-8
$ export LANG=en_US.UTF-8
Cassioscabral
quelle