Rubyのエンコードについて

このQ&Aのポイント
  • sublime text 2を使用している場合、Rubyのエンコードに関するエラーが発生する可能性があります。
  • プログラムの行頭で# encoding: UTF-8と指定してもエラーが解消されない場合、プログラムの実行時に-ruby -E UTF-8と指定する必要があります。
  • エンコードのエラーが出るプログラムは、正規表現の部分で何かが引っかかっている可能性があります。
回答を見る
  • ベストアンサー

Rubyのエンコードについて

エディタは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というノートパソコンを使っています。

noname#208914
noname#208914
  • Ruby
  • 回答数3
  • ありがとう数13

質問者が選んだベストアンサー

  • ベストアンサー
  • siffon9
  • ベストアンサー率64% (136/211)
回答No.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=2frubycmd.html
noname#208914
質問者

お礼

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

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

noname#208914
質問者

お礼

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

noname#208914
質問者

補足

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

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

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

noname#208914
質問者

お礼

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

関連するQ&A

  • なぜRuby1.9が日本語処理できない問題

    次の簡単なRubyプログラム(test.rb)ですが、 #!/usr/bin/env ruby # -*- coding: utf-8 -*- while gets $_.chomp! tmp = $_.split(/ /) s0 = tmp[0] s1 = tmp[1] s2 = tmp[2] puts "line #{s0}\t#{s1}\t#{s2}" end 入力テキストファイル(hello.txt)は次の2行です。 1 hello, everybody! 2 皆さん、 こんにちは。 test.rb hello.txt を実行すると、Ruby 1.8.7 は問題なく正常ですが。Ruby 1.9.3は次のエラーになりました。 line 1 hello, everybody! k1.rb:7:in `split': invalid byte sequence in US-ASCII (ArgumentError) from k1.rb:7:in `<main>' 何故でしょうか。詳しい方に教えて頂けるでしょうか。 どうぞ宜しくお願いします。

    • ベストアンサー
    • Ruby
  • Rubyプログラムヘッダ部分の書き方

    度々すみませんが、他人のRubyプログラムを試しながら勉強しているのです。 今回の質問はプログラムの先頭の書き方です。ご存知の方にご教示を頂きたいのです。 ついでに、こちらの動作環境はLinux-Mint、Ruby1.9.3です。 次のはサンプルプログラムの先頭の5行です。  1 #!/usr/bin/env ruby  2 # -*- mode:ruby; coding:utf-8 -*-  3 require 'kconv'  4 require 'moji'  5 Encoding.default_external = "utf-8" 質問1: 2行目は処理する文字コードがUTF-8の指定に見えます。どんな場合に必要ですか。 実はあるプログラムをUTF-8のデータを処理するときに、2行目があると invalid multibyte char (UTF-8) のエラーが出ました。抜いたら正常処理します。 質問2: 3、4行目は、日本語処理のクラスを利用するためのライブラリ指定ですが、 使い分けがよく分からないのです。 質問3: 5行目はどんな場合に必要でしょうか。2行目と同じような役割に見えますが.... 初歩的な質問ばかりですが、どうぞよろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • Ruby1.9.2でマジックコメントが反映されない

    基本的な質問になるのですが、 CentOS5.5でRuby1.9.2を利用しているのですが、スクリプト中に、マジックコメントを 入れているにも関わらず、「invalid multibyte char」エラーが返ってきます。 追加で設定する情報があるのでしょうか。 お手数お掛けしますが、ご存知の方がいらっしゃれば、ご教示ください。 # ruby -v ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux] # cat hello.rb # -*- encoding: utf-8 -*- puts 'こんにちは' # ruby -v hello.rb ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux] hello.rb:2: invalid multibyte char (UTF-8) hello.rb:2: invalid multibyte char (UTF-8) # ruby -Ks hello.rb hello.rb:2: invalid multibyte char (UTF-8) hello.rb:2: invalid multibyte char (UTF-8)

    • ベストアンサー
    • Ruby
  • Ruby の実行について

    Ruby初心者です。 メモ帳で puts "hello world"と打ち、名前をsample.rbにし、c:\Users\rbというファイルに保存しました。次にコマンドプロンプトで c:\Users\rb>ruby sample.rb と入力したんですが、'ruby'は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。といわれました。 どうすればいいのですか? 本を見てもネット上のサイトをみても >ruby ●●.rb なんです。

    • ベストアンサー
    • Ruby
  • ruby 1.9.3のrequireについて

    はじめまして。 私は今初めてrubyの勉強をしています。 使用している参考書はたのしいruby第3です。 ruby 1.9.3-P1.9.4でのrequireについて 今回質問させていただく内容としては requireを使用し外部ファイルを読み込もうとするとエラーになってしま.います。 同じディレクトリにファイルを置いています。 ディレクトリ構造として c:\workspaceの中にscopetest.rbとsub.rbをおいております。 scopetest.rb $x = 0 x = 0 require "sub" p $x p x sub.rb $x = 1 x = 1 実行コマンド ruby scopetestr.rb エラー C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- sub (LoadError) from C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:i n `require' from scopetest.rb:4:in `<main>' 参考書と同じにやっているのですがエラーがでてしまいます。 初歩的な質問かもしれませんがよろしくおねがいいたします。

    • ベストアンサー
    • Ruby
  • Rubyでの比較 (Float)

    Ruby初心者です。 簡単な比較を行いたいんですが、エラーが出てしまいます。 ファイルに ex. ruby_test.rb 0 12.3243 32 112.233 0.33123 とあり、このファイルを読み込んで比較しようとしています。 以下のコードで比較しようとしました。 ----------------------------------------------------------- fp = open("c:/ruby_test.txt") aaa = Array.new while line2 = fp.gets line2.chomp! bbb = line2.split(/\t/) aaa << bbb[1] if ( bbb[2] < 1.301029996 ) then       ※11行目 print "aaa\n" elsif ( bbb[2] < 8.164943898 ) then print "bbb\n" elsif ( bbb[2] >= 8.164943898 ) then print "ccc\n" end end fp.close -------------------------------------------- 実行すると ( ※ **** はファイル名 ) C:/ruby/*******.rb:11:in'<': comparison of String with Float failed (Argument Error) というエラーが出ます。 比較する  bbb[2] < 1.301029996  を bbb[2] < "1.301029996" すれば 動きますが、これでは文字列としての比較になってしまいますよね?? Floatは数字として比較するにはどうしたらよいのでしょうか? どなたか宜しくお願いします。

  • rubyがInternalServerError

    こんばんは。 自鯖にて初めてrubyを動かそうとしたところInternalServerError(500エラー)が帰ってきます。 まず、httpd.confに ---------------------- AddHandler cgi-script .cgi .rb ---------------------- と追加しました(このため.htaccessは作成しなくていいと思う)。 コマンドラインにて[which ruby][whereis ruby]を使い、[/usr/bin/ruby]にrubyがあることはわかるのですが、エラーが出てしまいます。 [test.rb] ---------------------- #!/usr/bin/ruby print "Content-type: text/html\n\n" print "test" ---------------------- 上記プログラムには755のパーミッションを与えています。 上記のフォルダにはCGI実行権が与えられています。 上記のフォルダではCGIはしっかりと動きます。 上記のプログラムはコマンドライン上[ruby test.rb]では動きます。 また、他のサイトもいろいろ調べましたが #!/usr/bin/env ruby #!ruby #!/usr/local/bin/ruby どのいパスでもエラーがでました。 解決方法を教えてください。 サーバ ---------------------- CentOS 5.4Final Apache 2.2.3 Ruby 1.8.5 ----------------------

  • rubyでコマンドプロンプトを使うとき

    rubyのスクリプトをコマンドプロンプトで実行する際に、ディレクトリ名を引数に指定したいと思っています。 その場合記述的には「ruby スクリプト名.rb ディレクトリ名」と書けばよろしいのでしょうか? 例えば「temp」というディレクトリがあり、それを指定したい場合は「ruby スクリプト名.rb temp」と書けば指定できてることになるのでしょうか。 低レベルな質問かもしれませんが、ruby超初心者なので教えて頂ければと思います。

    • ベストアンサー
    • Ruby
  • Ruby のコードの実行の仕方がわかりません。

    Ruby のコードの実行の仕方がわかりません。 私は、Javaプログラマーなのですが、Javaコードに行番号をつけて 整形したHTMLコードを出力してくれるツールを探していたところ Rubyで書かれたツール rb2html.rb にたどり着きました。 そこで、   http://rubyinstaller.org/download.html のサイトから、Ruby 1.8.7-p249 (RC2) をダウンロードし、WindowsXP(SP3)の   C:\Program Files\Ruby にインストールし   C:\Program Files\Ruby\bin にパスを通しました。コマンドプロンプトにて   C:\> ruby --version の入力に対して   ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mingw32] と出力されますので、インストールまでは成功していると思います。 次に、 rb2htmlrb を   http://www.nslabs.jp/rb2html.rhtml から   rb2html-2.4.tar.gz をダウンロードし、解凍後、rb2html-2.4 を   C:\Program Files\Ruby に置きました。 そして、とりあえずテストとして、同梱のsamples/Hoge.java で動作を確認してみようと   C:\Program Files\Ruby\rb2html-2.4>rb2html.rb samples/Hoge.java   | と入力してみたところ、何も出力されず、上記のようにカーソルが 点滅した状態で止まってしまっています。 どこに、問題があるのか、ご教授いただければ幸いです。

  • Rubyのcgiが動作しません。

    下記のように4行のルビーのcgiを作りました。 ファイル名rb.cgi #!/usr/bin/ruby print <<EOF あああ EOF これをRubyを提供しているapacheサーバにアップロードし パーミッションを777にしました。 文字コードはEUC、改行はLFのみです。 しかし、Internal Server Errorが表示されます。 そこで、サーバにログオンし、このcgiファイルの ディレクトリまで移動し、./rb.cgiを実行すると あああと表示されます。また、このcgiファイルと 同一ディレクトリにあるparlのcgi(掲示板)は 正常動作しています。 どこが間違っているのでしょうか?

    • ベストアンサー
    • CGI

専門家に質問してみよう