Rubyプログラムヘッダ部分の書き方

このQ&Aのポイント
  • Rubyプログラムのヘッダ部分の書き方について質問です。
  • プログラムの先頭の書き方に関する質問です。
  • 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
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.1

>質問1: 2行目は「マジックコメント」と言う。 「coding:utf-8」は、ソースコード上の「非ASCII文字」のエンコードがUTF-8であることを指定する。 つまり、ソースコード(プログラムのテキスト)の漢字がutf-8で書かれている事を指定する。 プログラムが扱う非ASCII文字のエンコードは関係ない。 例えば、ソースコード上に str = "漢字" と書かれていた場合、このマジックコメントが無いと、エラーになる(当然、ソースファイルはUTF-8で保存すること) 「mode:ruby」は、完全に「おまじない」で、rubyで動かすソースにはこう書く。 「うっかりPythonにソースコードを食わせちゃった時に、Pythonがエラーで止まって実行しない」って意味があったりなかったりするが「そういうもんだ」と思っておこう。 >質問2: kconvをrequireすると String#iseuc String#isjis String#issjis String#isutf8 String#kconv String#toeuc String#tojis String#tolocale String#tosjis String#toutf16 String#toutf32 String#toutf8 のメソッドが使えるようになる。 mojiをrequireすると Moji.type Moji.type? Moji.zen_to_han Moji.upcase Moji.kata_to_hira などの関数が使えるようになる。 >質問3: 5行目は、rubyの入出力が(と言うか、記述したプログラムの入出力が)utf-8で行なう事を強制している。 コンソールのロケールに関する環境変数がきちんと整っているなら不要。 逆に言うと、コンソールのロケールに関する環境変数を無視して、コンソールのエンコードと異なるエンコードで入出力する際には指定が必要。

biibulu
質問者

お礼

ご丁寧に分かりやすく回答して頂き、心から感謝致します。 悩んだ問題をよく解けました。とても役に立ちました。 本当にありがとうございました。

関連するQ&A

  • 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初心者です。作成したプログラムについて質問です。 某サイトの<td>セクター部分のデータを取得するプログラムを作ろうとしています。このプログラムのソースをあげときます。 # encoding: utf-8 require 'rubygems' require 'open-uri' require 'nokogiri' doc = Nokogiri::HTML(open("http://creofuga.net/"),nil,"utf-8") doc.css("td").each do |td| open("foo.txt", "w") do |f| f.write td.text end end このプログラムだと、最初のからデータを取得していくのですが、textファイルに書き込む際、1行目で得たデータを上書きをし、最終的に、サイトの最後の出たのみ出力する形となります。これをデータごとに改行しすべてのデータを出力するにはどのようにプログラムを変更すれば、よいかおしえてください。おねがいします。ちなみに最後に画像で取得したtextファイルのデータを上げときます。よろしくお願いします。

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

    • ベストアンサー
    • Ruby
  • 【ruby】クラスCGIを改造したい

    #!/usr/local/bin/ruby require 'cgi' require 'kconv' headers={ "status"=>"OK", "type"=>"text/html; charset=utf-8" } cgi=CGI.new hoge=cgi['arg'] cgi.out(headers){Kconv.toutf8(hoge)} 上記はcgiはクエリパラメータargに与えた文字列がUTF-8で表示される 物の基本骨格として記しました。 実際に作りたい物は、もう少し複雑で、cgi.outのブロックに渡す部分 は、ケースにより複数あります。 そこで、毎回ブロックに渡す部分をKconv.toutf8でくくるのは、如何な ものかと思い、CGIクラスそのものを改造して、 cgi.out(headers){hoge} と記述しても、UTF-8で出力されるようにしたいのですが、やり方が解 りません。 CGIクラスのoutメソッドをオーバーライドするのかなぁ? と思うのですが、オーバーライドってやった事が無いので、 手がかりがつかめません。 お手ほどきの、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • RubyってUTF16コードに対応していますか?

    Rubyで文字処理のプログラムを作ろうと思っているのですが、 RubyはUTF16コードに対応しているのでしょうか?

  • なぜ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
  • encode指定の表記について(Ruby 1.9)

    仕事でのデータ処理用にRubyで小さなプログラムを書いて使用しています。 今まで1.8系を使用していたのですが、そろそろ1.9系への移行をしたいと考えております。 そこで気になったのがソースの最初に書く # -*- coding: utf-8 -*- の表記です。 この"utf-8"の部分に書く文字コードの表記一覧(?)はどちらを参照すればよろしいのでしょうか? 例えば、私はWindows環境での使用になるのでシフトJISコードの場合が多いのですが、書き方として"SHIFT-JIS"、"Shift-JIS"、"SJIS"等のうち、どの表記が正解なのか判りません。 非常に初歩的な質問で申し訳ありませんが、ご教示いただければ幸いです。

    • ベストアンサー
    • Ruby
  • rubyの勉強をしていてプログラムを作っているのですがうまくいきません。

    rubyのプログラムを作っています。 指定したディレクトリの中の指定したファイルを検索します。 そしてファイルの有無を条件にして処理をしていくプログラムをつくっています。 イメージでは下記のような感じ if test.txtを検索(検索先のディレクトリは/../../tmp) #ファイル存在する なにもしない else #ファイルが存在しない test.txtを作成 処理1  test.txtを削除 end 日本語ばっかりで申し訳ないのですがこんな感じです。 今はifを使ったのですがそれ以外の方法でもかまいません。 できればサンプルのプログラムを載せていただけるとありがたいです。 ご教授をよろしくお願いします。 利用環境 Windows XP Home Edition cygwinをインストールしてrubyを実行しています

  • Ruby1.9での文字列操作について。

    Ruby1.9での文字列操作について。 今までRuby1.8を使用していましたが、Ruby1.9に変えてから、次の4種類の問題が出てきました。 (※Ruby1.9に変えてから、#encoding: shift_jisを定義しております) どれか1種類でも結構ですので、Ruby1.9での対策、代替の処理について教えてください。 <問題1> ■文字列を指定のバイト位置まで削除する □現在(Ruby1.8)のコード moji = "1あアあアイ234565789" moji[4,14] = "" →1.8では、"1あア"となりますが、1.9では、"1あアあ"となります。 <問題2> ■文字列の中から指定文字が見つかったバイト位置の算出 □現在(Ruby1.8)のコード n = "あいうえお".index("う") →1.8では、n=4となりますが、1.9では、n=2となります。 <問題3> ■指定した年月日の存在チェック □現在(Ruby1.8)のコード y = 1900 m = 3 d = 10 if Date.exist?(y,m,d) p "test# end →1.8では、trueとなりますが、1.9では実行時にNoMethoodErrorとなります。 <問題4> ■半角英数字→全角英数字変換 □現在(Ruby1.8)のコード sss = moji.tr('a-zA-Z0-9', 'a-zA-Z0-9') →1.9では実行時にエラーメッセージが出力されます(略) 色々と書きましたが、どうかお助けください。

    • ベストアンサー
    • Ruby
  • ruby erbでの表示がうまく行きません。

    本当に初心者ですので、質問が分かりづらいかもしれませんが、よろしくお願いします。 環境は、OS:WindowsXPSP3 ApacheHttpserver2.2 Ruby-186-26 RubyGems -v 0.9.4 です。 erbを使って簡易掲示版を作ろう!!と言うものなのですが、 ・keijiban.html ・keijiban.rb ・data.csv(書き込んだデータ保存用csv)・・・cgi-binに保存 ************************************************************ 入力ミスは散々見直しました。 添付ファイルが2つのファイルです。localhostで表示してみていますが、 初期表示は出来ますが、データを追加しようと『投稿する』ボタンをクリックすると 画面が真っ白になります。 入力ミスは散々見直しました。 初期表示が出来ると言う事は、keijiban.rbは動作していると思われます。 REDで簡易解析と言うのをしてみた所、次のエラーが出たり出なかったりです。 C:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- rde (LoadError) from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from C:\Program Files\RDE\rde_export.rb:9 from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require' from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/rb1D.tmp:71 Complete(1) 何か、インストールが足りないのでしょうか? 教えて下さい。 2000字超えたため、別ファイルに全文を記入しています。

    • ベストアンサー
    • Ruby

専門家に質問してみよう