2011年9月17日

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

こんにちは、なかむら(う)です。

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日 15:11
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/107013
トラックバック
コメント
コメントする




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