From: "俊(とし)" Date: 2011-09-17T20:26:15+09:00 Subject: [ruby-list:48370] Re: IO#set_encoding における改行コードの扱い? なかむら(う)さん, 早速のご回答ありがとうございました. IO でバイナリーモードというのはこれまで全く使ったことがなく,バイナリファイル(単なるバイトストリーム)を扱うためのもの,と思っておりました.改行コードの変換を行わない,という機能があるのは私にとっては新しい知見です.さっそく試してみたいと思います. ありがとうございました. -- 俊(とし) 2011年9月17日15:11 U.Nakamura : > こんにちは、なかむら(う)です。 > > 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