Ruby

衝撃の事実!? "# -*- encoding: utf-8 -*-"じゃなくてもいいんです!

More than 1 year has passed since last update.

Ruby 2.0以降ではデフォルトのエンコーディングがutf-8になったため、マジックコメントが不要になりました。(utf-8でスクリプトを書くのであれば)

本記事はRuby 1.9以前の場合、と考えてください。

参考:Ruby 2.0.0-p0 リリース


みなさんご存知だと思いますが、日本語を含むRubyスクリプトの場合、ファイルの先頭にファイルのエンコーディングを表すマジックコメントがないとエラーになります。

encoding_spec.rb
require 'rspec'

describe 'Japanese' do
  subject {'日本語'}
  it {should == '日本語'}
end
# 実行結果(エラーになる)
$ rspec encoding_spec.rb 
/Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load': /Users/mypc/dev/sandbox/encoding_spec.rb:4: invalid multibyte char (US-ASCII) (SyntaxError)
/Users/mypc/dev/sandbox/encoding_spec.rb:4: invalid multibyte char (US-ASCII)
/Users/mypc/dev/sandbox/encoding_spec.rb:4: syntax error, unexpected $end, expecting '}'
  subject(:japanese) {'日本語'}
                         ^
    from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `block in load_spec_files'
    from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `map'
    from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load_spec_files'
    from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/command_line.rb:22:in `run'
    from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:69:in `run'
    from /Users/mypc/.rvm/gems/ruby-1.9.3-p194/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:8:in `block in autorun'

マジックコメントは"# -*- encoding: utf-8 -*-"だけじゃない!

ネットの情報を見ていると、エンコーディングを指定するマジックコメントは、# -*- encoding: utf-8 -*-のように書かれていることが多いので、これを使っている人も多いと思います。

が!この書式が必須というわけではありません。

実は # coding: utf-8 だけでもOKなんです。

encoding_spec.rb
# coding: utf-8
require 'rspec'

describe 'Japanese' do
  subject {'日本語'}
  it {should == '日本語'}
end
# 実行結果(ちゃんと動く)
$ rspec encoding_spec.rb
.

Finished in 0.00042 seconds
1 example, 0 failures

ちなみに、codingの前には任意のプレフィックスを付けられるので、# encoding: utf-8と書いても正しく動きます。
また、大文字小文字を区別しないので、以下のようなマジックコメントでも動作します。

encoding_spec.rb
# HOGEHOGECODING: UTF-8
require 'rspec'

describe 'Japanese' do
  subject {'日本語'}
  it {should == '日本語'}
end

おまけ

ネットのサンプルコードとかでよく見かける -*- は、Emacsで使われる「エンコーディング指定プラグラマ」というものみたいです。
チームで開発するなら、Emacs固有のおまじないを埋め込むのはどうなんですかね〜??・・・なんて発言すると、宗教戦争が起きそうなので聞かなかったことにしてください。

というわけで、Rubyのエンコーディング指定に関するちょっとしたトリビア(?)でした!

参考文献

プログラミング言語Ruby
http://www.amazon.co.jp/dp/4873113946

Emacsのエンコーディング指定プラグマを挿入する
http://d.hatena.ne.jp/syohex/20091002/1254496402