アプリ版:「スタンプのみでお礼する」機能のリリースについて

エディタはsublime text 2を使っているのですが
楽しいRuby第四版のサンプルプログラムで学習を始めた当初、エンコードのエラーがでました。
プログラムの行頭に# encoding: UTF-8 とマジックコメントを打ってもエラーはなおらず、プログラムを呼び出す際に、>ruby -E UTF-8 と指定すると問題なく走りました。
で、その後も、日本語を使用したプログラムを実行する際にエンコードをプログラムの行頭で指定していないファイルでも、呼び出す際に「-E UTF-8」としなくても、問題なく走るようになったんですが。

楽しいRuby第四版のサンプルプログラムでlist6.15にstrip.rbというものがあり、内容は
file = File.open(ARGV[0])
file.each_line do |line|
 next if /^\s*$/ =~ line #空白行
 next if /^#/ =~ line  #シャープで始まる行
 puts line
end
file.close
というものがあり、これはコマンドラインから指定したファイルから空白行とシャープで始まる行を抜き取って出力するプログラムなんですが、これを実行する際にまたエンコードのエラーが出てしまいます。
プログラムの行頭で# encoding: UTF-8 と指定してもエラーになり、呼び出す際に>ruby -E UTF-8 strip.rb 呼び出すプログラム名 で問題なく走ったのですが、これは毎回呼び出すたびに-E -UTF-8を指定しないと走ってくれません。
日本語は使っていないプログラムなんで正規表現の部分で何かがひっかかっていると思うんですが、何が原因なんでしょうか。
エディタの問題なんでしょうか(ネットで調べるとsublime text 2はUTF-8しか対応していないと書いてありました。
また、パソコンはプログラム学習用として米国製のAcerというノートパソコンを使っています。

A 回答 (3件)

こんにちは



Eオプションは外部エンコード形式(および内部エンコード形式)を指定します。
ご質問に書かれたプログラムでいうと、ARGV[0]で指定したファイルはこのエンコード形式で書かれているよと指定するオプションです。このオプションがない場合はOSや環境から判断したデフォルトのエンコード形式が指定されます。

おそらく質問者様の環境でのデフォルトの外部エンコード形式がUTF-8では無いのではないかと思います。
この場合、プログラムのif文において正規表現はUTF-8を想定しているのに変数lineが示す文字列はデフォルトエンコード形式で読み込まれているので、一致せずにエラーになります。

対応方法としては、
1.ARGV[0]で読み込むファイルのエンコード形式をデフォルトの形式にする。
デフォルトの外部エンコード形式は以下で確認できます。

p Encoding.default_external


2.Eオプションの代わりにプログラム中で外部エンコード形式をUTF-8に設定しなおします。プログラムの最初で以下を記述します。

Encoding.default_external = 'utf-8'

参考URL:http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fru …
    • good
    • 0
この回答へのお礼

言われたとおりにすると解決できました!
ご親切にどうもありがとうございます。

お礼日時:2014/11/04 20:25

その「エンコードのエラー」の, 具体的なエラーメッセージを明らかにはできませんか?

この回答への補足

strip.rb:3:in `block in main': invalid byte sequence in Windows-31J (ArgumentError)
  from strip.rb:2:in `each_line'
  from strip.rb:2:in `<main>'

補足日時:2014/11/04 20:12
    • good
    • 0
この回答へのお礼

解決できました。ご回答ありがとうございます。

お礼日時:2014/11/04 20:29

あなたのソースには全角空白が含まれています。


以下に全角空白の個所を□で表示します。
---------------------------------------------
file = File.open(ARGV[0])
file.each_line do |line|
□next if /^\s*$/ =~ line #空白行
□next if /^#/ =~ line□□#シャープで始まる行
□puts line
end
file.close
----------------------------------
上記の全角空白を半角の空白に変えてください。
sublime text2は全角の空白も半角の空白もみためは、同じように表示しますので
注意してください。
    • good
    • 0
この回答へのお礼

すいません、読者に読みやすくインデントの代わりに空白を使いました。
プログラムの方ではちゃんと半角にしていたんですが・・・
空白やコンマも結構エラーの元ですよね、私もよくコンマや空白を消し
忘れてエラーを起してしまいます。

お礼日時:2014/11/04 20:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!