お題
Shift_JISで「こんにちは」と書かれたテキストファイルを作り、そのテキストファイルを読み込んでUTF-8で出力するスクリプトを作れ。
「たのしいRuby 第6版 P.426」より
回答
File.write("bar.txt", "こんにちは", encoding: "Shift_JIS") text = File.read("bar.txt", encoding: "Shift_JIS:UTF-8") puts text => こんにちは
説明
File.writeメソッドでファイルを作成できる。第1引数にファイル名を指定、第2引数には文字列。そしてencodingを指定すると外部エンコーディングを設定できる。ここではまずShift_JISを指定。これでShift_JISというエンコーディングで「こんにちは」と書かれたテキストファイルができあがる。
次に、それを読み込む。 File.readメソッドでエンコーディングを指定する。 左は外部エンコーディング、右が内部エンコーディングとなる。
つまり、「外部エンコーディングがShift_JISのテキストファイルを、UTF-8という内部エンコーディングで読み込め」という命令をしている。
学び
- IOオブジェクトは外部エンコーディングと内部エンコーディングという2つの情報を持つ
- 外部エンコーディングは入出力の対象となるファイルやコンソールで期待するエンコーディング
- 内部エンコーディングは、Rubyスクリプト内で扱うエンコーディングのこと
こう書くこともできた。
File.open("bar.txt", "w:Shift_JIS") do |f| f.write("こんにちは") end File.open("bar.txt", "r:Shift_JIS") do |f| str = f.read puts str.encode("UTF-8") end
どちらもFile.openメソッドを使い、書き込みモード指定、エンコーディングはShift_JIS。 読み出す方は最後にencodeメソッドでUTF-8に変えて出力。
参考: