Bug #924

encoding for stdio's

Added by Yuki Sonoda over 6 years ago. Updated almost 4 years ago.

[ruby-dev:37576]
Status:Closed
Priority:Normal
Assignee:Yukihiro Matsumoto
ruby -v:1.9.2 Backport:

Description

=begin
Yuguiです。

stdout, stderrのexternal encodingがnilなのはこういうものでしたっけ?
default_externalを期待してました。

それから、-Eext:intしたときには少なくともinternal_encodingに反映された方
が使いやすいと思うのですが、いかがでしょうか。

% cat test.rb
p [STDIN, STDOUT, STDERR].map{|io|
[io.external_encoding, io.internal_encoding]
}

% ruby-trunk -v test.rb

ruby 1.9.1 (2008-12-22 p-5000 trunk-r20912) [i386-darwin9.6.0]
[[#Encoding:UTF-8, nil], [nil, nil], [nil, nil]]

% ruby-trunk -vEcp932 test.rb
ruby 1.9.1 (2008-12-22 p-5000 trunk-r20912) [i386-darwin9.6.0]
[[#Encoding:Windows-31J, nil], [nil, nil], [nil, nil]]

% ruby-trunk -vE:euc-jp test.rb
ruby 1.9.1 (2008-12-22 p-5000 trunk-r20912) [i386-darwin9.6.0]
[[#Encoding:UTF-8, nil], [nil, nil], [nil, nil]]

% ruby-trunk -vEcp932:euc-jp test.rb

ruby 1.9.1 (2008-12-22 p-5000 trunk-r20912) [i386-darwin9.6.0]
[[#Encoding:Windows-31J, nil], [nil, nil], [nil, nil]]

--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする
=end

History

#1 Updated by Yuki Sonoda over 6 years ago

  • Priority changed from Low to Normal
  • Target version set to 1.9.1 Release Candidate

=begin

=end

#2 Updated by Yukihiro Matsumoto about 6 years ago

=begin
まつもと ゆきひろです

In message "Re: [BUG:trunk] encoding for stdio's"
on Wed, 24 Dec 2008 18:20:49 +0900, "Yugui (Yuki Sonoda)" yugui@yugui.jp writes:

|stdout, stderrのexternal encodingがnilなのはこういうものでしたっけ?
|default_externalを期待してました。
|
|それから、-Eext:intしたときには少なくともinternal_encodingに反映された方
|が使いやすいと思うのですが、いかがでしょうか。

手落ちだと思います。設定されるべきでしょう。

=end

#3 Updated by Yuki Sonoda about 6 years ago

=begin
On 12/29/08 6:22 PM, Yukihiro Matsumoto wrote:

まつもと ゆきひろです
|stdout, stderrのexternal encodingがnilなのはこういうものでしたっけ?
|default_externalを期待してました。

成瀬さんからは「stdout, stderrの出力が自動変換されないように」という意図
だった返事を頂きました。
Rubyとしてどちらが良いものでしょうか。

|それから、-Eext:intしたときには少なくともinternal_encodingに反映された方
|が使いやすいと思うのですが、いかがでしょうか。

手落ちだと思います。設定されるべきでしょう。

internal_encodingは手落ちだとは思いますが、とはいえ$stdout, $stderrにつ
いてはexternal_encodingがnilのままだと意味がないですね。

--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする

=end

#4 Updated by Yukihiro Matsumoto about 6 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [BUG:trunk] encoding for stdio's"
on Mon, 29 Dec 2008 18:35:15 +0900, "Yugui (Yuki Sonoda)" yugui@yugui.jp writes:

|> |stdout, stderrのexternal encodingがnilなのはこういうものでしたっけ?
|> |default_externalを期待してました。
|
|成瀬さんからは「stdout, stderrの出力が自動変換されないように」という意図
|だった返事を頂きました。

default_internalが導入されるまでは「自動変換」はなかったわけ
ですし、default_externalが設定されない理由にはならないのでは
ないかと思います。

|Rubyとしてどちらが良いものでしょうか。

default_internalを導入した以上、入出力については自動変換はや
むなしではないかと思います。

=end

#5 Updated by Yui NARUSE about 6 years ago

=begin
成瀬です。

Yukihiro Matsumoto wrote:

まつもと ゆきひろです

In message "Re: Re: [BUG:trunk] encoding for stdio's"
on Mon, 29 Dec 2008 18:35:15 +0900, "Yugui (Yuki Sonoda)" yugui@yugui.jp writes:

|> |stdout, stderrのexternal encodingがnilなのはこういうものでしたっけ?
|> |default_externalを期待してました。
|
|成瀬さんからは「stdout, stderrの出力が自動変換されないように」という意図
|だった返事を頂きました。

default_internalが導入されるまでは「自動変換」はなかったわけ
ですし、default_externalが設定されない理由にはならないのでは
ないかと思います。

|Rubyとしてどちらが良いものでしょうか。

default_internalを導入した以上、入出力については自動変換はや
むなしではないかと思います。

default_internal は導入されましたが、自動変換はデフォルトはオフになっています。
このため、入力エンコーディングの自動変換はデフォルトだと働きません。
この状態で、出力だけ自動変換をするというのはおかしいように思います。

また、default_internal が nil でも出力自動変換を行うとした場合、
実際問題として自動変換をして欲しくない場合の指定が困難になるという問題もあります。

しかし、一方で、IO#external_encoding の挙動が奇妙なのも確かで、たとえば、
% ruby19 -e'open("fuga.txt","r+"){|f|p f.external_encoding}'
nil
% ruby19 -e'open("fuga.txt","r"){|f|p f.external_encoding}'
#Encoding:UTF-8
こんな問題もあり、external_encoding は設定される必要がありそうです。

つまるところ、
* 現在の自動変換周りの挙動は変えない
* でも external_encoding は出力でも常に設定する
が妥当ではないかと思います。

ここで、external_encoding が常に真になるようになるため、
自動変換の有無のフラグを、external_encoding から何を用いるようにするかが問題ですが、
internal_encoding の有無を見れば大丈夫かなぁと思っています。

--
NARUSE, Yui naruse@airemix.jp

=end

#6 Updated by Yuki Sonoda about 6 years ago

  • Target version changed from 1.9.1 Release Candidate to 1.9.1 RC2

=begin

=end

#7 Updated by Yuki Sonoda about 6 years ago

  • Target version changed from 1.9.1 RC2 to 1.9.2

=begin

=end

#8 Updated by Shyouhei Urabe about 6 years ago

  • Assignee set to Yukihiro Matsumoto
  • ruby -v set to 1.9.2

=begin

=end

#9 Updated by Takashi Tamura over 5 years ago

=begin
こんばんは sheepman です。

結局、1.9.2 で stdio の encoding はどうなる/なったのでしょうか。
=end

#10 Updated by Yui NARUSE over 5 years ago

=begin
まず、現在のところは変わっていません。

今後ですが、
* 現在の自動変換周りの挙動は変えない
* IO#external_encodingの戻り値を変更する
(明示的に指定されていない際に、default_externalを返しているのをやめる)
という主張を成瀬は持っているので、後でパッチを出します。
=end

#11 Updated by Takashi Tamura over 5 years ago

=begin
成瀬さんが以前書かれた以下の前提は変わったと思うのですが、
現在でも標準入出力を自動変換しない理由をもう少し詳しく書いていただけないでしょうか。

default_internal は導入されましたが、自動変換はデフォルトはオフになっています。
このため、入力エンコーディングの自動変換はデフォルトだと働きません。
この状態で、出力だけ自動変換をするというのはおかしいように思います。

あと標準入出力を自動変換しない場合、非 ASCII 文字を標準出力に出力したい時には、
どのように書くのがベストプラクティスなんでしょうか。

今だと default_internal を指定しても標準入力は変換されませんが、ファイルの入力は変換されます。

$ echo $LANG
ja_JP.eucJP

$ nkf --guess t.txt
EUC-JP

$ cat e01.rb
p $stdin.read.encoding
p File.read('t.txt').encoding

$ echo 漢字 | ruby-1.9 -vE :utf-8 e01.rb
ruby 1.9.2dev (2009-07-24 trunk 24263) [i686-linux]
#Encoding:EUC-JP
#Encoding:UTF-8

=end

#12 Updated by Yui NARUSE over 5 years ago

  • Status changed from Open to Assigned

=begin
とりあえず、r24337にて以下のような変更を入れました。

Set encodings of stdio after setting default internal and external.

  • io.c (rb_stdio_set_default_encoding): added.

  • ruby.c (process_options): call rb_stdio_set_default_encoding
    after setting defualt internal and external.
    =end

#13 Updated by Yusuke Endoh almost 5 years ago

=begin
成瀬さん
遠藤です。

このチケットは何のために残っているのでしょうか。
ぱっと見でわかるように、残る検討事項・問題の summary を書いて
もらえると助かります。

もし仕様レベルの検討事項が残るだけならば、すでに仕様フリーズ
してしまったので、target を 1.9.x にしてください。

--
Yusuke Endoh mame@tsg.ne.jp
=end

#14 Updated by Yui NARUSE almost 5 years ago

  • Status changed from Assigned to Closed

=begin
チケットのゴールが明確でなかったため、途中でゴールが追加されたために残ってしまったという感じですかねぇ。
自動変換とか、パッチワーク的な現行仕様のドキュメント化とかと整理とかもありますが、まぁそれは別のチケットと言うことで。
=end

Also available in: Atom PDF