Bug #924
closedencoding for stdio's
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]
#<a href="Encoding:UTF-8" class="external">Encoding:UTF-8</a>, 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]
#<a href="Encoding:Windows-31J" class="external">Encoding:Windows-31J</a>, 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]
#<a href="Encoding:UTF-8" class="external">Encoding:UTF-8</a>, 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]
#<a href="Encoding:Windows-31J" class="external">Encoding:Windows-31J</a>, nil], [nil, nil], [nil, nil
--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Priority changed from 3 to Normal
- Target version set to 1.9.1 Release Candidate
=begin
=end
Updated by matz (Yukihiro Matsumoto) almost 16 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:37576] [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
Updated by yugui (Yuki Sonoda) almost 16 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
Updated by matz (Yukihiro Matsumoto) almost 16 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:37653] 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
Updated by naruse (Yui NARUSE) almost 16 years ago
=begin
成瀬です。
Yukihiro Matsumoto wrote:
まつもと ゆきひろです
In message "Re: [ruby-dev:37653] 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
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Target version changed from 1.9.1 Release Candidate to 1.9.1 RC2
=begin
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Target version changed from 1.9.1 RC2 to 1.9.2
=begin
=end
Updated by shyouhei (Shyouhei Urabe) almost 16 years ago
- Assignee set to matz (Yukihiro Matsumoto)
- ruby -v set to 1.9.2
=begin
=end
Updated by sheepman (Takashi Tamura) over 15 years ago
=begin
こんばんは sheepman です。
結局、1.9.2 で stdio の encoding はどうなる/なったのでしょうか。
=end
Updated by naruse (Yui NARUSE) over 15 years ago
=begin
まず、現在のところは変わっていません。
今後ですが、
- 現在の自動変換周りの挙動は変えない
- IO#external_encodingの戻り値を変更する
(明示的に指定されていない際に、default_externalを返しているのをやめる)
という主張を成瀬は持っているので、後でパッチを出します。
=end
Updated by sheepman (Takashi Tamura) over 15 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
Updated by naruse (Yui NARUSE) over 15 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
Updated by mame (Yusuke Endoh) over 14 years ago
=begin
成瀬さん
遠藤です。
このチケットは何のために残っているのでしょうか。
ぱっと見でわかるように、残る検討事項・問題の summary を書いて
もらえると助かります。
もし仕様レベルの検討事項が残るだけならば、すでに仕様フリーズ
してしまったので、target を 1.9.x にしてください。
--
Yusuke Endoh mame@tsg.ne.jp
=end
Updated by naruse (Yui NARUSE) over 14 years ago
- Status changed from Assigned to Closed
=begin
チケットのゴールが明確でなかったため、途中でゴールが追加されたために残ってしまったという感じですかねぇ。
自動変換とか、パッチワーク的な現行仕様のドキュメント化とかと整理とかもありますが、まぁそれは別のチケットと言うことで。
=end