• ベストアンサー

ruby テキストファイル書き出しでの文字化け

ruby&mac&文字の扱い 初心者です。 mac os 10.6.8 HTMLの情報を読み込みテキストファイルに書き出したいのですが、 ターミナル上、putsではきちんと日本語で表示されるのですが、書き出したあとの txtファイルを開くと文字化けしています。 File.open("test.txt","w") do |file| @s_info.each do |data| puts data[:m_sec] file.puts data[:m_sec] end end よろしくお願いします。

  • kmufo
  • お礼率87% (7/8)
  • Ruby
  • 回答数2
  • ありがとう数12

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

テキストエディットから、現在のコードを確認するのはちょっと大変です。 他のテキストエディタを使って開いてみてはどうでしょうか? 例えば mi http://www.mimikaki.net/ などが定番で、これだと、自動判定もテキストエディットより優秀だし、失敗しても手動で変更できます。 文字コードが確認できたら、それが期待するものなのか、違うものなのかを確認します。 期待するものなら、テキストエディットで自動判別できないだけです。 期待と違うものなら、 File.open("test.txt","w") で、出力文字コードを指定するようにます。 http://docs.ruby-lang.org/ja/1.9.3/class/IO.html 例: 期待する文字コード: UTF-8 text.txtの文字コード: UTF-8  なら、テキストエディットで自動判定できないだけ。 期待する文字コード: UTF-8 text.txtの文字コード: EUC-JP  なら、UTF-8で出力するように File.open("test.txt","w:utf-8") 等と指定する

kmufo
質問者

お礼

ご丁寧にわかりやすいご説明ありがとうございます! sublime text2で開いたらきちんと見れました。 大変勉強になり助かりました。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> txtファイルを開くと文字化けしています。 この開くのに使ったアプリケーションは何ですか? そのアプリケーションに、「文字コード」「エンコード」等という項目はありませんか?

kmufo
質問者

補足

テキストエディットです。(test.txt)

関連するQ&A

  • rubyでPDFファイルを読みたい

    PDFファイルを、rubyで読み込みたいのですが、 そのようなことを可能にする方法(ライブラリ)は、ありますでしょうか? つまり、 f = open "index.txt" f.each do |line|  puts line end この場合の「index.txt」が、テキストファイルでなく、 「index.pdf」というPDFファイルだった場合にも 同様の出力結果を期待したい、ということです。 (バイナリデータではなく、テキストデータを出力したい。) 実現手段をご存知の方がいましたら、何卒、教えて下さい。

  • rubyのactive_recordについて

    # coding:utf-8 require 'active_record' ActiveRecord::Base.configurations = YAML.load_file('database.yml') ActiveRecord::Base.establish_connection('development') class Bookinfo < ActiveRecord::Base end bookinfo = Bookinfo.order("updated_at DESC").first bookinfo.each do |info| puts info.id puts info.author puts info.title puts info.page puts info.date_available end rubyでSQLite3のデータベースにアクセスしてデータの一番新しいものを1つ取り出すプログラムを作成しようと思います。(データベース名: bookinfo.db テーブル名:bookinfo)  このように書いてみましたが、またいろいろ試して見たのですが、どうしてもうまくい きません。教えてくださいお願いします。

    • ベストアンサー
    • Ruby
  • Ruby 暗号化したファイルの復号について

    Rubyでファイルを暗号化し、それを復号したいのですがうまくいかないため、 質問させていただきます。 Ruby 1.9.3を使用しています。 ・ファイルの暗号化 encrypt.rb ------------------------------------------------- # encoding: cp932 require 'openssl' def encrypt(file, pass)   enc = OpenSSL::Cipher::AES256.new('CBC')   enc.encrypt   enc.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.sec", 'wb') do |fout|       while buff = fin.read(8000)         fout.write(enc.update(buff))       end       fout.write(enc.final)     end   end   enc.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       encrypt(arg, pass)       puts "#{arg}を暗号化したファイル#{arg}.secを作りました。"     rescue       puts "#{arg}の暗号化に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- ・ファイルの復号 decrypt.rb ------------------------------------------------- # encoding: cp932 def decrypt(file, pass)   dec = OpenSSL::Cipher::AES256.new('CBC')   dec.decrypt   dec.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.plain", 'wb') do |fout|       while buff = fin.read(512)         fout.write(dec.update(buff))       end       fout.write(dec.final)     end   end   dec.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       decrypt(arg, pass)       puts "#{arg}を復号したファイル#{arg}.plainを作りました。"     rescue       puts "#{arg}の復号に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- コマンドプロンプトでencrypt.rb自身を暗号化し、encrypt.rb.secの作成はできるのですが、 decrypt.rbを実行してパスワードを入力しても復号ができません。 どのようにすれば復号できるのか教えていただけますでしょうか。

    • ベストアンサー
    • Ruby
  • Rubyでpdfファイルを読み込む方法

    Rubyでpdfファイルを読み込む方法を探しています。 file = open("sample.pdf", "r") file.each { |f| puts f } というコードを書いて実行すると文字化け?したようになったり、数字ばかりの行が挿入されていたりと、txt形式のファイルを読み込んだ時の様に文字が正しく出力されません。 何かpdfを読み込む正しい方法があるのでしょうか。 また、直接読み込むことはせずにpdftotext.exeを使って予めtxt形式に変換しようと考えたのですが、Rubyのスクリプトの中でpdftotext.exeを使う方法が分かりません。 解決方法をご存じの方がいらっしゃいましたら教えて頂けないでしょうか。 環境はWindowsです。よろしくお願いします。

    • ベストアンサー
    • Ruby
  • [Ruby] irbにおける文字化け

    Rubyを勉強を始めようと思いまして、Active Script Ruby1.8.22をインストールし、irb(Interactive RuBy)を使って簡単な機能の勉強をしていました。 その際、ある特定の場合、日本語が文字化けしてしまう。という分からないことが出てきましたので質問させて頂きます。 一つ目は、 printやputsなどで日本語を表示させようとする場合、 print("") print("あいうえお") のように、print("") と入力後、カーソルを移動させ "" の中に あいうえお を入れた後エンターすると以下のように print("あいうえお")と表示されるところが文字化けしてしまうということです。しかし、それを実行すると、しっかりと あいうえお と表示されます。 irb(main):031:0> print(" 「 、 ヲ ィ") あいうえお=> nil これを文字順通りに、 print(" print("あいうえお print("あいうえお") のように、print("  の後に、あいうえお を入力。その後括弧閉じすると以下のようにしっかりと、print("あいうえお")と表示されます。 irb(main):032:0> print("あいうえお") あいうえお=> nil どちらの実行結果も変わらず、しっかりと あいうえお と表示されるのですが、やはり命令入力の段階での文字化けが気になります。 二つ目は、 配列の文字化けです。 waza = ["殴る", "蹴る", "強く殴る", "強く蹴る"]といれてエンターすると、以下のように配列の中の日本語が文字化けします。 (また、これも当然一つ目のprintやputsのように、 waza = ["殴る", "蹴る", "強く殴る", "強く蹴る"] を書く際に先に waza = ["", "", "", ""] と書いた後、カーソル移動で日本語入力すると、命令の部分も文字化けします。以下に載せているのは、命令部分が文字化けしないように左から順に書いていったものです。) irb(main):022:0* waza = ["殴る", "蹴る", "強く殴る", "強く蹴る"] => ["\211\243\202\351", "\217R\202\351", "\213\255\202\255\211\243\202\351", "\ 13\255\202\255\217R\202\351"] irb(main):023:0> 5.times do irb(main):024:1* waza.each do |w| irb(main):025:2* print(w) irb(main):026:2> print(" ") irb(main):027:2> end irb(main):028:1> print("\n") irb(main):029:1> end 殴る 蹴る 強く殴る 強く蹴る 殴る 蹴る 強く殴る 強く蹴る 殴る 蹴る 強く殴る 強く蹴る 殴る 蹴る 強く殴る 強く蹴る 殴る 蹴る 強く殴る 強く蹴る => 5 これも、printやputsと同じように結果はしっかりと文字化けせず表示されるのです。 使用OSはWindows XP Home Edition version2002 Service Pack 2です。 あまりよく分かっていないため、分かりにくく、ややこしい文ですが、回答をお待ちしています。よろしくお願いします。 状況等で詳しく知りたいところや何か分からない所がありましたら質問していただければ幸いです。分かる範囲で答えたいと思います。 参考になるかは分かりませんが、他の文字での文字化け例を下記します。 [1]左から順に入力したputs("こんにちは") irb(main):035:0> puts("こんにちは") こんにちは => nil [2]先にputs("")を入力したputs("こんにちは") irb(main):036:0> puts(" ア ノ ソ ヘ") こんにちは => nil [3]waza =["", "", "", ""]を先に入力後カーソル移動で日本語入力したwaza = ["殴る", "蹴る", "強く殴る", "強く蹴る"] irb(main):037:0> waza =[" 」 ・, " R ・, " ュ ュ 」 ・, " ュ ュ R ・] => ["\211\243\202\351", "\217R\202\351", "\213\255\202\255\211\243\202\351", "\2 13\255\202\255\217R\202\351"] irb(main):038:0> waza[0] => "\211\243\202\351" irb(main):039:0> waza[1] => "\217R\202\351" [4]wazaの要素の出力 irb(main):040:0> waza.each do |w| irb(main):041:1* print(w) irb(main):042:1> end 殴る蹴る強く殴る強く蹴る=> ["\211\243\202\351", "\217R\202\351", "\213\255\202\2 55\211\243\202\351", "\213\255\202\255\217R\202\351"]

  • rubyでハングル含むファイル名を読むと文字化け

    ruby 初心者です 環境は以下の通り Windows7 64bit Ruby 2.3.1 状況 rubyでハングル含むファイル名をリネームしたいのですが、 フォルダ内のファイル名を読み込んでputsで表示すると、ハングル文字が「??」に文字化けして、 又、renameを実行するとエラーになります。 ハングル文字化けBJ??になる Windowsのファイル名 999-BJ쏘이-hkqwer-20211115.mp4 rubyで読み込んだ後、putsで確認するとハングルが文字化けする 999-BJ??-hkqwer-20211115.mp4 質問 ハングル文字の文字化けを直すには、どの様に指定すればよいのでしょうか? また、.renameする際、何か指定があれば、知りたいです。 補足) ちなみに、ファイル名が、英数や漢字・かなを含む場合や、 .rb内でファイル名に直接ハングル文字を指定すると、正常にリネーム出来ています。 変更前:999-BJ쏘이-hkqwer-20211115.mp4 変更後:☆korean 259-BJ쏘이-hkqwer-20211115.mp4 補足) ・renameを実行するとエラー ren2.rb:207:in 'rename': Invalid argument @ rb_file_s_rename - (C:USers/xxxxxx/Desktop/☆korean/999-BJ??-hkqwer-20211115.mp4, C:USers/xxxxxx/Desktop/☆korean/☆korean 259-BJ??-hkqwer-20211115.mp4) (Errno::EINVAL) ren2.rb:207:in `rename': Invalid argument @ rb_file_s_rename - (C:Users/xxxxxx /Desktop/☆korean/999-BJ??-hkqwer-20211115.mp4, C:Users/xxxxxx/Desktop/☆korean/ ☆korean 259-BJ??-hkqwer-20211115.mp4) (Errno::EINVAL) ・.openにエンコード指定するとエラーになる Dir.open("#{tr_path}", "rw:sjis:utf-8") do |dir| ren2.rb:48:in `open': wrong number of arguments (given 2, expected 1) (ArgumentError) ・実行したソース ruby ren2.rb # coding: UTF-8 ms_path = "G:\/G_Download\/G_XVIDEOS\/1優良\/☆korean" # 本番用 tr_path = "C:\Users/xxxxxx/Desktop/☆korean" # テスト用 Dir.open("#{tr_path}") do |dir| # テスト用 for tr_name in dir puts tr_name # # # .と..を読み飛ばす # # if tr_name == "." || tr_name == ".." then next end # # 読み込んだファイル名から抽出した文字s_nameで、本番用フォルダーを検索して、 # あれば「☆korean xxx-」を取得する # # # テスト用文字 # s_name = "hkqwer" # # 保存用フォルダを検索して、類似ファイルが存在したら、☆korean xxx-を取得する # Dir.glob("#{ms_path}/*#{s_name}*.mp4") do |x| if File.basename(x).include?("☆korean ") == true then #☆korean か? ms_num = File.basename(x)[0,12] elsif File.basename(x).include?("☆Korean ") == true then #☆Korean か? ms_num = File.basename(x)[0,12] else next end # # 999-を☆korean xxx-で置き換える # new_name = tr_name.gsub("999-", ms_num) # 999-を☆korean xxx-へ置き換える # # 元ファイルを、新ファイル名に変更する # File.rename("#{tr_path}/#{tr_name}", "#{tr_path}/#{new_name}") end end end

    • ベストアンサー
    • Ruby
  • Rubyのスクリプト

    つぎのようなスクリプトを組みました。これはこれで、動いておりますが、お願いです。 (1)Rubyらしい書き方にするには、どこを改めればよいですか? (2)ref_file=open("myReference.txt") の部分は、 外部のレファレンスを用いて名前を翻訳しているところです。 この部分を、関数呼び出しでやってしまいたい。どのように組みなおせば良いですか? 宜しくお願いいたします。 --------------------- おおまかな説明:ディレクトリ「myData」の中にあるlogファイルをひとつずつオープン。 まず、「Target」という単語を探し、その直後にある単語を掴んで、外部のレファレンスファイル「myReference.txt」からrealNameを持ってくる。 その後、処理-----を実行する。 myPath='C:\myData\' print Dir.getwd,"\n" Dir.chdir(myPath) Dir.foreach(myPath) { |myFileName| if /.log/i =~myFileName file_source_body=open(myFileName, "r") while text=file_source_body.gets do if(/Target (\w+\/)/=~text) then myTargetName=$1 ref_file=open("myReference.txt") # (2)のアイテムの部分 while ref_info=ref_file.gets do (/#{myTargetName}\s(\S+)/i=~ref_info) && (realName=$1) end ref_file.close end end ------- ------- ------- }

  • 【ruby】特異クラスを使って,File.statをカスタムしたい

    File.statに、nameというメソッドを追加したいです。 st=File.stat('hoge.txt') puts st.name #=> hoge.txt 上記のように使いたいのです。 そこで、以下の様に書いてみました。(行頭のスペースは全角です) class File  class << self   def stat(file)    st=File::Stat.new(file)    class << st     def name      @file     end    end    st   end end end st=File.stat('./hoge.txt') puts st.name #=> nil 上記実行結果はnilが出力され、期待した結果は得られませんでした。 上記の様に書いた理由を以下に記します。 クラスメソッドstatは、file.rbのclass Fileの中に定義されていて、 stat.rbのFile::Stat.new(file)を戻り値としていました。 stat.rbのclass File::Statのinitializeでは、 def initialize(file)  @file = file  (略) end となっていたので、上記の様に書いてみたのですが、何が悪いのでしょうか? ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • Rubyでテキスト内容を別のテキストに一度に出力したいのですが、どのよ

    Rubyでテキスト内容を別のテキストに一度に出力したいのですが、どのようにすればよいのでしょうか。 rubyはさっきはじめたところです。 一通り検索しましたが、やり方がヒットしませんでした。 a.txtの内容: aaaaa bbbbb ccccc ... を、ファイルコピーではなくoutput.txtに出力したいのですが、 a = open("a.txt") o = open("output.txt",w) ??? a.close o.close で、???の部分にどのような処理を書けばよいのでしょうか。 putsやwriteで書いてみたのですが、(o.write a) #<File:0x28a4450> と出力され、(ファイルオブジェクトのアドレス?)、a.txtの内容が出力出来ませんでした。 a.xxx のようにするのかな、と予想しますが、方法は問いませんので、ご教示いただけないでしょうか。

    • ベストアンサー
    • Ruby
  • Ruby Win環境 .(ドット)から始まるファイルのctime

    カレントディレクトリにある全てのファイル及びディレクトリの変更時刻を取得したいです。 Dir.foreach('.') do |file| puts File.ctime(file) end そこで、上記Rubyスクリプトを作成し実行しました。 しかし、カレントに.(ドット)から始まるファイルを置いて上記rubyスクリプトを実行すると、 `ctime': No such file or directory - .htaccess (Errno::ENOENT)のエラーになってしまいます。(.htaccessをカレントに置いた例) Win環境固有のものかと思いますが、なにか対策があるでしょうか?

専門家に質問してみよう