エディタは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というノートパソコンを使っています。
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=2fru …
No.2
- 回答日時:
その「エンコードのエラー」の, 具体的なエラーメッセージを明らかにはできませんか?
この回答への補足
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>'
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は全角の空白も半角の空白もみためは、同じように表示しますので
注意してください。
すいません、読者に読みやすくインデントの代わりに空白を使いました。
プログラムの方ではちゃんと半角にしていたんですが・・・
空白やコンマも結構エラーの元ですよね、私もよくコンマや空白を消し
忘れてエラーを起してしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Windows 8 win8 "ベータ ワールドワイド言語サポートで Unicode UTF-8 を使用"を出したい 2 2023/05/23 19:57
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- PHP PHPプログラムの間違い 1 2022/10/06 14:33
- PHP Content-Typeが機能していない? 2 2022/07/17 11:10
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
- Ruby MacBookAir起動時にRubyソースコードをコマンドラインで実行するには? MacのOS起動時 1 2022/04/18 01:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スポーツ施設での出来事で心配...
-
UWSCで指定のフォルダを開きたい。
-
Excelで4096点以上のFFTの方法
-
あるプログラムのコマンドライ...
-
VBAにてメール作成した際、一部...
-
メモリ上にプログラムをロード...
-
パックマンプログラム
-
インクリメント演算子のみを用...
-
Excelに埋め込んだVBAのプログ...
-
読み込み中にアクセス違反が発...
-
Vba 実数および実数タイプの変...
-
main関数を先頭に置くデメリット
-
VBAでユーザーフォームが自動的...
-
白色雑音(ガウス性)のプログラム
-
Notepad++の関数リスト表示でC...
-
「Outlookが他のプログラムによ...
-
未使用の変数を一括検索する方法
-
PICマイコンのコピー(クローン...
-
C言語で移動平均のプログラムを...
-
方対数グラフを書く為の計算方...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あるプログラムのコマンドライ...
-
Excelで4096点以上のFFTの方法
-
「Outlookが他のプログラムによ...
-
Excelに埋め込んだVBAのプログ...
-
VBAにてメール作成した際、一部...
-
Notepad++の関数リスト表示でC...
-
自動クエリとはどういうもので...
-
読み込み中にアクセス違反が発...
-
PICマイコンのコピー(クローン...
-
XnViewにwebpを「いつも開く」...
-
未使用の変数を一括検索する方法
-
VBAでユーザーフォームが自動的...
-
UWSCで指定のフォルダを開きたい。
-
パックマンプログラム
-
このプログラミング誰か教えて...
-
モジュール、アプリケーション...
-
Vba UserFormを前面に出す方法...
-
特定のwebサイトのタイトルや記...
-
ドロップダウンリストの文字を...
-
テキストボックスのエンターキ...
おすすめ情報