2011年9月17日

[ruby-list:48370] Re: IO#set_encoding における改行コードの扱い?

なかむら(う)さん,

早速のご回答ありがとうございました.

IO でバイナリーモードというのはこれまで全く使ったことがなく,バイナリファイル(単なるバイトストリーム)を扱うためのもの,と思っておりました.改行コードの変換を行わない,という機能があるのは私にとっては新しい知見です.さっそく試してみたいと思います.

ありがとうございました.

--
俊(とし)


2011年9月17日15:11 U.Nakamura <usa@xxxxx>:
> こんにちは、なかむら(う)です。
>
> In message "[ruby-list:48368] IO#set_encoding における改行コードの扱い?"
> on Sep.17,2011 14:22:59, <toshio.otaguro@xxxxx> 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 <usa@xxxxx>


投稿者 xml-rpc : 2011年9月17日 20:26
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/107014
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。