RailsおよびRuby 1.9では無効なマルチバイト文字(US-ASCII)


197

Rails 2.3.4でRuby 1.9.1を使用していますが、アプリケーションはテキスト入力を処理します

私のようなものを試してみると(中の引用符は異なって見えます)

text = "”“"

次のエラーが発生します。

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

ユーザーが入力する可能性があるため、これらの引用符を使用する必要があり、それを考慮する必要がありますか?

何か案は?


コードにバックティックが含まれていないにもかかわらず、バックティックを使用していると非難されている場合は、ファイルに奇妙な間隔/タブ/改行の問題がある可能性があります。たとえば、StackOverflowの空白に投稿してみてください。そうすれば、SOは奇妙な動きを始めます。奇妙なスペース、タブ、改行を削除します。繰り返しますが、コードをSOブランクに貼り付けて、プレゼンテーション用にコードをフォーマットしようとすることは、ヒントを与える1つの方法です。
boulder_ruby 2012

回答:


691

ASCII以外の文字を使用するスクリプトに魔法のコメントを追加してみましたか?スクリプトの上に配置する必要があります。

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

それは魅力のように私のために働いた。


2
うーん.........それをファイルの先頭に追加しましたが、それでも同じエラーメッセージが表示されます。助言がありますか?
Artem Kalinchuk 2012年

8
中心的な説明は、リンクされた@dalyonsの記事にあります。特に断りのない限り、ソースファイルはUS-ASCIIエンコーディングを受け取ります。ソースのエンコーディングを変更せずに非ASCIIコンテンツを文字列リテラルに配置すると、Rubyはそのエラーで終了します。みんなありがとう、私はついにそれを手に入れました:-)
ベース-t

2
#!/bin/env rubyコマンドラインから実行可能ファイルとしてスクリプトを実行している場合を除き、必要はありません。# encodingラインは、それ自体で動作します。
2013

10
# encoding: utf-8。2013年後半で、まだこのゲームをプレイする必要があります。ちょっと待って、電話が鳴っています...それは2033年でした。まあ、2010年から、Jarek Zmudzinskiを思い出させてくれてありがとう
thomax

1
@gotqn -ここに同じ記事を見つけてください- graysoftinc.com/character-encodings/...
Alokスウェイン

43

プロジェクトのすべてのソースファイルにマジックコメントを簡単に追加する場合は、magic_encodinggem を使用できます

sudo gem install magic_encoding

次にmagic_encoding、アプリのルートからターミナルを呼び出します。


この種の詳細を覚えておくことは重要だと思うので、少なくとも数か月間はその宝石を使用せず、#encoding:utf-8を手動で記述します。
Marcel Valdez Orozco

レール2.3&ルビー1.9助けにgemfileする「宝石magic_encoding」を追加
Elmor

これはキュウリのテストに統合されません。
トリップ

1
@Elmorそのような外部ライブラリをプロジェクトのGemfileに配置してはいけません。magic_encodingはコマンドラインツールにすぎず、プロジェクトの依存関係ではありません。
Nowaker 2014年

17

私は自分の解決策を追加したいだけです。

私はö、ü、äのようなドイツ語のウムラウトを使用し、同じエラーが発生しました。
@Jarek Zmudzinskiがどのように機能するかを説明しましたが、これが私のものです。

このコードをコントローラーの上部に追加します# encoding: UTF-8
(たとえば、ウムラウトでフラッシュメッセージを使用するため)。

私のコントローラーの例:

# encoding: UTF-8
class UserController < ApplicationController

これで、ö、ä、ü、ß、 ""などを使用できます。


8

これらの斜めの二重引用符はASCII文字ではありません。エラーメッセージは、それらが「マルチバイト」であることについて誤解を招くものです。


2
なぜ誤解を招くのですか?それらマルチバイト文字です。
Matthew Scharley、2009年

4
ASCIIはマルチバイトエンコーディングを定義しないためです。ASCIIに関しては、これらは意味不明なものであり、関連するエンコーディングでたまたま有効です。
Phil Miller、

8

Ruby 2.0以降、追加する必要がないことに注意してください# encoding: utf-8。UTF-8は自動的に検出されます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.