From: "U.Nakamura" Date: 2011-09-17T15:11:08+09:00 Subject: [ruby-list:48369] Re: IO#set_encoding における改行コードの扱い? こんにちは、なかむら(う)です。 In message "[ruby-list:48368] IO#set_encoding における改行コードの扱い?" on Sep.17,2011 14:22:59, wrote: > 改行コードは $\ で指定できることは知っているのですが,IO#set_encoding と改行コードは > 独立なのでしょうか? はい。 > > その場合,入力ファイルの改行コードと同じ改行コードで出力するためのスマートな方法は > ないでしょうか? IOには改行コードを取り扱う「モード」という状態がありまして、 具体的には「テキストモード」というものと「バイナリモード」と いうモードが存在します。 「バイナリモード」というのは入出力時に改行コードの変換を行わ ないモード、「テキストモード」というのは変換を行うモード、で す。 Windowsにおけるデフォルトのモードはテキストモードです。 あなたの例では特にこのモードを操作していませんから、inpと$stdout の両方がテキストモードです。 たいへんよい状態ですね :) さて、あなたの本当の希望は「同じ改行コードで出力する」ではな く、「入力時、出力時、共に改行コードを変換しない」のはずです。 というわけで、inpと$stdoutの両方をバイナリモードに変更するの が正しい対処法となります。 IO#binmodeがそれを行うメソッドです。 なお、IO#set_encodingはエンコーディングのみを変更してモードは 変更しませんが、IO#binmodeはモードをバイナリモードに変更する と同時にエンコーディングをASCII-8BITに変更する、という機能を 持ちます。 従って、IO#set_encodingとIO#binmodeの実行順序には注意を払う必 要があります。 ところで、既にオープン済みである$stdoutはともかく、今からオー プンしようとしているファイルについては、わざわざ後でメソッド を呼ばなくても、オープン時にモードやエンコーディングを指定す ることができます。 具体的には、 inp = open(filename, "rb:UTF-8") で、 inp = open(filename, "r") inp.binmode inp.set_encoding("UTF-8") と同じ効果を得ることができます。 それでは。 -- U.Nakamura