• 締切済み

Ruby(on Windows) でUTF-8

Windows上でRuby使っています。 NetBeansで勉強していて、ファイルはすべてUTF-8で書くようにしています。 以下のコードのように、あるファイルを保存するプログラムを書いて、日本語ファイル名で保存したとき(この場合、ファイル名はUTF-8の文字列になるんですよね。)、 (1)と、(2)で同じファイル名の出力を期待しているんですが、名前が変わってしまいます。なぜでしょうか。 Windows上では、ファイル名はShift-JISなどに変換してから保存しないとうまくいかないのでしょうか。 saving_folder = "C:/testrubyfolder/" filename = "ユニコードです" puts filename #←(1) open(saving_folder + filename , "w"){|file| file << "test" } puts Dir.entries(saving_folder) #←(2)

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

Rubyが呼び出すCのライブラリ関数やWindowsAPIは UTF-8を処理できません。また、現状Unicodeを使用するAPIを呼び出すようには 実装されていないので、たとえば日本語WindowsであればShiftJISで データを渡さなければなりません。 自動変換はされないので、自分で行う必要があります。 質問にある例の場合、渡されたUTF-8のデータをそのままの形で ShiftJISで書かれたものとして処理してしまっているので、 ファイル名が変わっているように見えるのです。

jollymed
質問者

お礼

どうもあありがとうございます。 初めての質問だったので、回答してもらっているのに気づきませんでした。 すっきりしました。どうもありがとうございます

関連するQ&A

  • Rubyでの日本語コードの指定

    同じrubyスクリプトを、MacOSとWindowsで動かしたいと思っています。 日本語が正常に表示されないのでいろいろやっていく内に、解せないことがあります。 MacOS上で puts($KCODE) puts("テスト") という2行のファイルを、UTF-8、及び S_JISで保存してそれぞれ -Ku -Ks オプションをつけて実行させてみると、S_JISの方は正しく表示されません。 $KCODEの値は正しく SJIS になっていました。 Windwsで同じファイルを走らせると、S_JISの方は正しく表示されますが、UTF-8 の方が正しく表示されません。 rubyのバージョンは1.8.7、エディタは mi を使用しました。 なにか勘違いしてるのでしょうか?

    • ベストアンサー
    • Ruby
  • Rubyにおける変数

    Windows2000上で、Rubyを動かしています。 皆様のお陰で、少しずつ進んでおります。しかし、また質問させてください。 変数に、ファイル名を代入して、実行すると、動かなくなりました。 実名を入れた、system('tar zxf test_20070511.tar.gz')では、動きますが、 変数にした、system('tar zxf myFilename')では、動きません。 Rubyスクリプト ---------------------- print Dir.getwd,"\n" Dir.chdir('C:\myData\myData2') print Dir.getwd,"\n" dir = Dir.open('C:\myData\myData2') while myFilename=dir.read do if /.tar.gz/i =~myFilename then puts myFilename system('tar zxf myFilename') end end dir.close ------------------------------------ 宜しくお願いいたします。

  • 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 の実行について

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

    • ベストアンサー
    • Ruby
  • 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 1.9.3でShift-JIS文字列を

    よろしくお願いします。 Rubyでスマフォ(SH-02D)の電話帳のQUOTED-PRINTABLEの文字列を WindowsのShift-JIS文字列に変換してファイルに出力したいのですが putsだと日本語文字列に見えるのですが、printだと[]で囲まれた16進数の (一部は^のように表示されますが)列になってしまいます。 ネットで検索してもprintはそのまま、putsは強制改行があるという 違いしかないように思えるのですがどうすればputsと同じ出力を 強制改行無しに出力できるのでしょうか。 RubyはWindows 7 Professional x64でeclipse INDIGOにAptana Studioを 入れて入力&実行しています。 (プレアデスも入ってます。ソースのエンコードはS-JISです。) sub_column = column[i].split("/;/") quoted_string = sub_column[j].unpack("M") puts quoted_string print quoted_string ---- (抜粋) でputsとprintで見え方が違うのです。

  • 保存形式としてのUnicode、UTF-8

    「Unicode、UTF-8 違い」などでネットを検索すると Unicode・・・文字コード UTF-8・・・符号化方式 とのことで、同次元のものではないとのこと。 しかし、 さくらエディタ、TeraPadなどのテキストエディタの保存形式に Unicode、UTF-8などがあるのですが、この違いは何でしょうか? 前提として、iPhone/iPadにてテキストファイルを扱おうとすると Gmailの添付ファイル、Dropboxなどで文字化けする(デコードできない)ので どちらかの形式に統一しようと思ったのですが、 あとあと困るといやなので、正確に理解したいと思った次第です。 どうぞよろしくお願いします。

  • UTF-16テキストファイルの作成

    エクセルで作成したデータをUTF-16形式で保存したいのですが、 「名前をつけて保存」でファイルの種類を選ぼうとしても、 該当の形式が見当たりません。 Unicodeテキストで保存してからメモ帳で開いて文字コードを変更しようとしてみましたが、UTF-8しか選択肢がありません。 どなたか方法を知ってる方、教えてください。お願いします。

  • UTF-8での保存について

     エディットボックスに入力してある日本語の文字列をUTF-8やUTF-8Nでテキストファイルに保存したのですがうまくいきません。  UTF-8の場合はファイルの先頭に3バイトのBOMをつければいいらしいので、 ファイルの先頭に0xEF,0xBB,0xBFの3バイトを追加してテキストファイルに保存しましたがメモ帳で開くと文字化けします(メモ帳で開くときは文字コードをUTF-8にして開いてます)。 作成したテキストファイルをバイナリエディタで開いてみると先頭の3バイトはEFBBBFとなっているので何も問題はないと思うのですが、どうして文字化けするファイルができてしまうのでしょうか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • プログラミング ruby について

    悩んだ挙句、尋ねる相手もいないため、質問させてください。 テキストエディタに "puts 1+2" として、「calc.rb」と名前をつけて保存。その後コマンド プロンプトで"ruby calc.rb"で実行とすると、"3"と出力するはずのところ、"ruby: No such file or directory -- calc.rb (LoadEroor)"とでます。 何が原因でしょうか? ちなみに、テキストエディタとして、メモ帳 or SciTEを使用。 また、"ruby -v"の実行は、うまく表示されました

    • ベストアンサー
    • Ruby