[#48382] Ruby/Gstreamer for Windows — ashbb <ashbbb@...>

こんにちは。

17 messages 2011/09/22
[#48383] Re: Ruby/Gstreamer for Windows — Kouhei Sutou <kou@...> 2011/09/23

須藤です。

[#48385] Re: Ruby/Gstreamer for Windows — ashbb <ashbbb@...> 2011/09/23

須藤さん

[#48392] 要素のない配列の挙動? — 俊(とし) <toshio.otaguro@...>

前略

21 messages 2011/09/24
[#48393] Re: 要素のない配列の挙動? — TADA Tadashi <t@...> 2011/09/24

ただただしです。

[#48394] Re: 要素のない配列の挙動? — 俊(とし) <toshio.otaguro@...> 2011/09/24

ただただし さん

[#48399] Re: 要素のない配列の挙動? — nonta@... 2011/09/24

野田と申します。

[#48400] Re: 要素のない配列の挙動? — 俊(とし) <toshio.otaguro@...> 2011/09/24

皆さま

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

From: "U.Nakamura" <usa@...>
Date: 2011-09-17 06:11:08 UTC
List: ruby-list #48369
こんにちは、なかむら(う)です。

In message "[ruby-list:48368] IO#set_encoding  における改行コードの扱い?"
    on Sep.17,2011 14:22:59, <toshio.otaguro@gmail.com> 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@garbagecollect.jp>


In This Thread