Bug #354

Test failure test/ruby/test_transcode.rb

Added by Martin Dürst over 6 years ago. Updated almost 4 years ago.

[ruby-dev:35636]
Status:Closed
Priority:Low
Assignee:Martin Dürst
ruby -v: Backport:

Description

=begin
test_iso_2022_jp ので 262 行目 (と 267 行目) は RuntimeError で失敗します。
原因は "\x1b$(Dd!\x1b(B".force_encoding("iso-2022-jp") での JIS X 0212 の 区68 点01
の「銙」という字です。iso-2022-jp は成瀬さん、このテストは mane さんが入れましたので、
整理お願いできますでしょうか。
=end

History

#1 Updated by Yui NARUSE over 6 years ago

  • Status changed from Open to Assigned
  • Priority changed from Normal to Low
  • Category set to M17N

=begin
現在の Ruby 1.9 における「ISO-2022-JP」は、同「EUC-JP」をベースに実装しているのですが、
この「EUC-JP」は正確には Microsoft CP51932 と呼ばれるものに極めて近いもの、
つまり MS 風のテーブルを用いた「EUC-JP」亜種になっています。
これには本当の EUC-JP (IANA 定義) に含まれている JIS X 0212 が含まれていません。

そのため、その実装を用いている「ISO-2022-JP」にも JIS X 0212 が含まれず、
このバグが発生するわけです。

以上のような理由のため、修正は transcode の仕様の確定待ちとなるため、
「当面の間修正されない既知のバグ」というのが現在のステータスになります。
# なので、そのような趣旨の別ファイルにテストを移動したい

なお、workaround としては「iconv または nkf を用いる」になります。
=end

#2 Updated by Yui NARUSE over 6 years ago

=begin
ISO-2022-JP は JIS X 0212 を含まないのではないかという指摘をいただきました、仰る通り。

ここで、
* ISO-2022-JP-1 には含むので、そちらに移す
* EUC-JP は含むのでそちらに移す
* ISO-2022-JP が含むべきなのに現在含んでいない文字・・・はないので、
マッピングが誤っているものを書く
* そういえばいわゆる半角カナが変換できちゃうのでそれも
などという対処がありえますが、失敗するテストばかり追加してもしょうがないので、
reminder がわりにとりあえず現在のでいいかなーと。
=end

#3 Updated by Martin Dürst over 6 years ago

  • Status changed from Assigned to Closed
  • Assignee changed from Yui NARUSE to Martin Dürst

=begin
色々な情報ありがとうございます。それに合わせてテストを修正しました。
reminder をコメントに残しました。テストと実装の隔たりがなくなりましたので、
close します。
=end

#4 Updated by Yusuke Endoh over 6 years ago

=begin
遠藤です。

2008/07/25 2:41 NARUSE, Yui naruse@airemix.jp:

行単位の restart は ISO-2022-JP や UTF-7 は可能な気がします。
つまるところ、decode しなくても改行の認識が可能な encoding については、
gets をサポートする方向です。

test_terminator_stateful_conversion(TestIO_M17N) のように、gets に
デリミタを指定するようなのも、サポート対象外ですよね。たぶん。

サポート対象外の要求に対しては NotImplementedError を投げるのは
どうでしょうか。これならそれなりにテストが書けそうです。

Index: io.c
===================================================================
--- io.c (revision 18257)
+++ io.c (working copy)
@@ -323,11 +323,17 @@
return;
}

+static rb_encoding *io_input_encoding(rb_io_t *fptr);
+
static void
io_ungetc(VALUE str, rb_io_t *fptr)
{
int len = RSTRING_LEN(str);

  • if (rb_enc_dummy_p(io_input_encoding(fptr))) {
  • rb_raise(rb_eNotImpError, "ungetc against dummy encoding is not currently supported");
  • }
    +
    if (fptr->rbuf == NULL) {
    fptr->rbuf_off = 0;
    fptr->rbuf_len = 0;
    @@ -1950,6 +1956,9 @@

    GetOpenFile(io, fptr);
    rb_io_check_readable(fptr);

  • if (rb_enc_dummy_p(io_input_encoding(fptr)) && rs != rb_default_rs) {

  • rb_raise(rb_eNotImpError, "gets with delimiter against dummy
    encoding is not currently supported");

  • }
    if (NIL_P(rs)) {
    str = read_all(fptr, 0, Qnil);
    if (RSTRING_LEN(str) == 0) return Qnil;
    @@ -2265,6 +2274,10 @@
    int r, n, cr = 0;
    VALUE str;

  • if (rb_enc_dummy_p(enc)) {

  • rb_raise(rb_eNotImpError, "getc against dummy encoding is not
    currently supported");

  • }
    +
    if (io_fillbuf(fptr) < 0) {
    return Qnil;
    }

    Index: test/ruby/test_io_m17n.rb

    --- test/ruby/test_io_m17n.rb (revision 18257)
    +++ test/ruby/test_io_m17n.rb (working copy)
    @@ -161,11 +161,13 @@
    with_tmpdir {
    src = "before \e$B\x23\x30\x23\x31\e(B
    after".force_encoding("iso-2022-jp")
    generate_file('tmp', src)

  •  s = open("tmp", "r:iso-2022-jp:euc-jp") {|f|
    
  •    f.gets("0".force_encoding("euc-jp"))
    
  •  }
    
  •  assert_equal(Encoding.find("euc-jp"), s.encoding)
    
  •  assert_str_equal(src.encode("euc-jp"), s)
    
  •  assert_raise(NotImplementedError) do
    
  •    s = open("tmp", "r:iso-2022-jp:euc-jp") {|f|
    
  •      f.gets("0".force_encoding("euc-jp"))
    
  •    }
    
  •    assert_equal(Encoding.find("euc-jp"), s.encoding)
    
  •    assert_str_equal(src.encode("euc-jp"), s)
    
  •  end
    

    }
    end

@@ -218,13 +220,30 @@
with_tmpdir {
src = "\e$B\x23\x30\x23\x31\e(B".force_encoding("iso-2022-jp")
generate_file('tmp', src)
- open("tmp", "r:iso-2022-jp:euc-jp") {|f|
- assert_equal("\xa3\xb0".force_encoding("euc-jp"), f.getc)
- assert_equal("\xa3\xb1".force_encoding("euc-jp"), f.getc)
- }
+ assert_raise(NotImplementedError) do
+ open("tmp", "r:iso-2022-jp:euc-jp") {|f|
+ assert_equal("\xa3\xb0".force_encoding("euc-jp"), f.getc)
+ assert_equal("\xa3\xb1".force_encoding("euc-jp"), f.getc)
+ }
+ end
}
end

  • def test_ungetc_stateful_conversion
  • with_tmpdir {
  • src = "before \e$B\x23\x30\x23\x31\e(B after".force_encoding("iso-2022-jp")
  • generate_file('tmp', src)
  • assert_raise(NotImplementedError) do
  • s = open("tmp", "r:iso-2022-jp:euc-jp") {|f|
  • f.ungetc("0".force_encoding("euc-jp"))
  • f.read
  • }
  • assert_equal(Encoding.find("euc-jp"), s.encoding)
  • assert_str_equal(("0" + src).encode("euc-jp"), s)
  • end
  • }
  • end + def test_open_ascii with_tmpdir { src = "abc\n"

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#5 Updated by Yui NARUSE over 6 years ago

=begin
成瀬です。

Yusuke ENDOH wrote:

2008/07/25 1:02 Tanaka Akira akr@fsij.org:

In article e0b1e5700807240845o4c09cfa5gae142c1dd0c74170@mail.gmail.com,
"Yusuke ENDOH" mame@tsg.ne.jp writes:

  • test_getc_stateful_conversion(TestIO_M17N)
  • test_terminator_stateful_conversion(TestIO_M17N)
    • stateful encoding は当分サポートされない transcode は stateful encoding をサポートし始めていますよ。

「サポートされないエンコーディングなので ISO-2022-JP にからんだ挙動は
不定であり、transcode は一部が偶然うまく動いているに過ぎない」と私は
理解していました。

が、成瀬さんか Martin さんの言質 (と、明文化された公式のドキュメント)
が欲しいです。

「サポートされない」と理解した根拠は、成瀬さんの日頃の発言と、るりまです。

enc というか鬼車というか、String クラスや正規表現といった Ruby M17N 本体では
stateful encoding はサポートしません。

一方で、transcode はそれとは別の仕組みなので独立しています。

transcode 的には、stateful encoding は restartable に現状ならないために、
getc を変換しつつ読みだすことができません。
文字単位の restart は 1.9.1 ではサポートしません。

行単位の restart は ISO-2022-JP や UTF-7 は可能な気がします。
つまるところ、decode しなくても改行の認識が可能な encoding については、
gets をサポートする方向です。

全部一気に読みこむ場合はサポートします。

まとめると、
* getc, ungetc ×
* gets ○
* read ○
以上のような限定的なサポートが提供される予定です。

--
NARUSE, Yui naruse@airemix.jp

=end

#6 Updated by Yusuke Endoh over 6 years ago

=begin
遠藤です。

2008/07/24 0:44 Yui NARUSE redmine@ruby-lang.org:

以上のような理由のため、修正は transcode の仕様の確定待ちとなるため、
「当面の間修正されない既知のバグ」というのが現在のステータスになります。

なので、そのような趣旨の別ファイルにテストを移動したい

賛成です。直る予定のないテストを make test-all に放置しておくのは、

  • テスト結果の視認性が悪くなり、リグレッションテストがしにくくなる

  • 「テストは多少失敗しててもいい」というダメな認識が広まってしまう

  • 事情を知らない人にはビルドの失敗などと区別がつかない

の 3 点から、よくないと思います。

そのような状態だと思われるテストは、以下の 3 点です。

  • test_getc_stateful_conversion(TestIO_M17N)
  • test_terminator_stateful_conversion(TestIO_M17N)

    • stateful encoding は当分サポートされない
  • test_iso_2022_jp(TestTranscode)

    • EUC の補助漢字は当分サポートされない

これらは test/ruby/PENDINGS.rb に移し、make test-all (や make check)
では実行しないようにしたいと思います。
(ただし、何でもかんでも PENDINGS.rb に入れたらダメです。重要。)

どんなもんでしょうか。

以下のパッチでは、make test-all-including-pendings で PENDINGS.rb も
含めたテストを走らせるようにしてみました。

Index: common.mk
===================================================================
--- common.mk (revision 18196)
+++ common.mk (working copy)
@@ -368,6 +368,9 @@
test-all:
$(RUNRUBY) "$(srcdir)/test/runner.rb" --basedir="$(TESTSDIR)"
--runner=$(TESTUI) $(TESTS)

+test-all-including-pendings:
+ $(RUNRUBY) "$(srcdir)/test/runner.rb" --basedir="$(TESTSDIR)"
--runner=$(TESTUI) --pattern=PENDINGS.rb $(TESTS)
+
extconf: $(PREP)
$(MINIRUBY) -run -e mkdir -- -p "$(EXTCONFDIR)"
$(RUNRUBY) -C "$(EXTCONFDIR)" $(EXTCONF) $(EXTCONFARGS)
Index: test/ruby/test_transcode.rb
===================================================================
--- test/ruby/test_transcode.rb (revision 18196)
+++ test/ruby/test_transcode.rb (working copy)
@@ -259,13 +259,11 @@
assert_raise(RuntimeError) { "\x1b$(A".encode("utf-8", "iso-2022-jp") }
assert_equal("\uff71\uff72\uff73\uff74\uff75",

"\x1b(I12345\x1b(B".force_encoding("iso-2022-jp").encode("utf-8")) #
JIS X 0201 ァィゥェォ
- assert_equal("\u9299", "\x1b$(Dd!\x1b(B".encode("utf-8",
"iso-2022-jp")) # JIS X 0212 区68 点01 ?
assert_raise(RuntimeError) { "\x1b$C".encode("utf-8", "iso-2022-jp") }
assert_raise(RuntimeError) { "\x1e".encode("utf-8", "iso-2022-jp") }
assert_raise(RuntimeError) { "\x80".encode("utf-8", "iso-2022-jp") }

  assert_equal("\x1b(I12345\x1b(B".force_encoding("iso-2022-jp"),
               "\uff71\uff72\uff73\uff74\uff75".encode("iso-2022-jp"))
  • assert_equal("\x1b$(Dd!\x1b(B".force_encoding("iso-2022-jp"),
    "\u9299".encode("iso-2022-jp"))
    end
    end

    Index: test/ruby/test_io_m17n.rb

    --- test/ruby/test_io_m17n.rb (revision 18196)
    +++ test/ruby/test_io_m17n.rb (working copy)
    @@ -157,18 +157,6 @@
    }
    end

  • def test_terminator_stateful_conversion

  • with_tmpdir {

  •  src = "before \e$B\x23\x30\x23\x31\e(B
    

    after".force_encoding("iso-2022-jp")

  •  generate_file('tmp', src)
    
  •  s = open("tmp", "r:iso-2022-jp:euc-jp") {|f|
    
  •    f.gets("0".force_encoding("euc-jp"))
    
  •  }
    
  •  assert_equal(Encoding.find("euc-jp"), s.encoding)
    
  •  assert_str_equal(src.encode("euc-jp"), s)
    
  • }

  • end

    def test_nonascii_terminator
    with_tmpdir {
    generate_file('tmp', "before \xA2\xA2 after")
    @@ -214,17 +202,6 @@
    }
    end

  • def test_getc_stateful_conversion

  • with_tmpdir {

  •  src = "\e$B\x23\x30\x23\x31\e(B".force_encoding("iso-2022-jp")
    
  •  generate_file('tmp', src)
    
  •  open("tmp", "r:iso-2022-jp:euc-jp") {|f|
    
  •    assert_equal("\xa3\xb0".force_encoding("euc-jp"), f.getc)
    
  •    assert_equal("\xa3\xb1".force_encoding("euc-jp"), f.getc)
    
  •  }
    
  • }

  • end

    def test_open_ascii
    with_tmpdir {
    src = "abc\n"

    Index: test/ruby/PENDINGS.rb

    --- test/ruby/PENDINGS.rb (revision 0)
    +++ test/ruby/PENDINGS.rb (revision 0)
    @@ -0,0 +1,62 @@
    +# -- encoding: ASCII-8BIT -- # make sure this runs in binary mode
    +# some of the comments are in UTF-8
    +
    +require 'test/unit'
    +require 'tmpdir'
    +require 'timeout'
    +
    +class TestIO_M17N_PENDING < Test::Unit::TestCase

  • def with_tmpdir

  • Dir.mktmpdir {|dir|

  •  Dir.chdir(dir) {
    
  •    yield dir
    
  •  }
    
  • }

  • end
    +

  • def generate_file(path, content)

  • open(path, "wb") {|f| f.write content }

  • end
    +

  • def encdump(str)

  • "#{str.dump}.force_encoding(#{str.encoding.name.dump})"

  • end
    +

  • def assert_str_equal(expected, actual, message=nil)

  • full_message = build_message(message, <<EOT)
    +#{encdump expected} expected but not equal to
    +#{encdump actual}.
    +EOT

  • assert_block(full_message) { expected == actual }

  • end
    +

  • def test_getc_stateful_conversion

  • with_tmpdir {

  •  src = "\e$B\x23\x30\x23\x31\e(B".force_encoding("iso-2022-jp")
    
  •  generate_file('tmp', src)
    
  •  open("tmp", "r:iso-2022-jp:euc-jp") {|f|
    
  •    assert_equal("\xa3\xb0".force_encoding("euc-jp"), f.getc)
    
  •    assert_equal("\xa3\xb1".force_encoding("euc-jp"), f.getc)
    
  •  }
    
  • }

  • end
    +

  • def test_terminator_stateful_conversion

  • with_tmpdir {

  •  src = "before \e$B\x23\x30\x23\x31\e(B
    

    after".force_encoding("iso-2022-jp")

  •  generate_file('tmp', src)
    
  •  s = open("tmp", "r:iso-2022-jp:euc-jp") {|f|
    
  •    f.gets("0".force_encoding("euc-jp"))
    
  •  }
    
  •  assert_equal(Encoding.find("euc-jp"), s.encoding)
    
  •  assert_str_equal(src.encode("euc-jp"), s)
    
  • }

  • end
    +end
    +
    +class TestTranscode_PENDING < Test::Unit::TestCase

  • def test_euc_jis_x_0212

  • assert_equal("\u9299", "\x1b$(Dd!\x1b(B".encode("utf-8",
    "iso-2022-jp")) # JIS X 0212 区68 点01 ?

  • assert_equal("\x1b$(Dd!\x1b(B".force_encoding("iso-2022-jp"),
    "\u9299".encode("iso-2022-jp"))

  • end
    +end

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#7 Updated by Yusuke Endoh over 6 years ago

=begin
2008/07/25 1:02 Tanaka Akira akr@fsij.org:

In article e0b1e5700807240845o4c09cfa5gae142c1dd0c74170@mail.gmail.com,
"Yusuke ENDOH" mame@tsg.ne.jp writes:

  • test_getc_stateful_conversion(TestIO_M17N)
  • test_terminator_stateful_conversion(TestIO_M17N)
    • stateful encoding は当分サポートされない

transcode は stateful encoding をサポートし始めていますよ。

「サポートされないエンコーディングなので ISO-2022-JP にからんだ挙動は
不定であり、transcode は一部が偶然うまく動いているに過ぎない」と私は
理解していました。

が、成瀬さんか Martin さんの言質 (と、明文化された公式のドキュメント)
が欲しいです。

「サポートされない」と理解した根拠は、成瀬さんの日頃の発言と、るりまです。

http://doc.loveruby.net/refm/api/view/spec/m17n

ダミーエンコーディング
サポートしません。Ruby はエンコーディングの名前だけ知っている状態です。ISO-2022-JP, UTF-7 がこれにあたります。

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#8 Updated by Yusuke Endoh over 6 years ago

=begin
遠藤です。

2008/07/30 7:33 Tanaka Akira akr@fsij.org:

In article e0b1e5700807290517mee11539lfbd82d4dfc98c53f@mail.gmail.com,
"Yusuke ENDOH" mame@tsg.ne.jp writes:

2008/07/25 2:41 NARUSE, Yui naruse@airemix.jp:

行単位の restart は ISO-2022-JP や UTF-7 は可能な気がします。
つまるところ、decode しなくても改行の認識が可能な encoding については、
gets をサポートする方向です。

test_terminator_stateful_conversion(TestIO_M17N) のように、gets に
デリミタを指定するようなのも、サポート対象外ですよね。たぶん。

なんでサポート対象外なんですか?

改行の認識の話ばっかりだったので、そういう前提かと誤読してました。

ちょっと UTF-7 を調べてみたんですが、RFC 2152 によると任意の文字を
BASE64 でエンコードしてもいいようです。

$ echo foo+AAo-bar | iconv -f=UTF-7 -t=UTF-8 | od -c
0000000 f o o \n b a r \n
0000010

これでは改行文字が認識できない可能性があるので、UTF-7 に対する
gets は一切禁止しなければならないと思います。
それならいっそ dummy encoding に対する gets はすべて禁止しちゃえ、
というのが私の意見です。

が、どうしても ISO-2022-JP で gets したいという需要が無視できない
のでしたら、gets で ISO-2022-JP だけ特別扱いするのはどうでしょう。
IO が stateful encoding をサポートする日までの workaround です。

ESC 以外の制御文字だけからなるデリミタだけは通すようにしました。

Index: io.c
===================================================================
--- io.c (revision 18264)
+++ io.c (working copy)
@@ -1956,8 +1956,23 @@

  GetOpenFile(io, fptr);
  rb_io_check_readable(fptr);
  • if (rb_enc_dummy_p(io_input_encoding(fptr)) && rs != rb_default_rs) {
  • rb_raise(rb_eNotImpError, "gets with delimiter against dummy encoding is not currently supported");
  • /* FIXME! please support stateful encoding */
  • if (rb_enc_dummy_p(io_input_encoding(fptr))) {
  • const char *name = rb_enc_name(io_input_encoding(fptr));
  • if ((strcmp(name, "ISO-2022-JP") == 0 || strcmp(name, "ISO2022-JP") == 0 ||
  • strcmp(name, "ISO-2022-JP2") == 0 || strcmp(name, "ISO2022-JP2") == 0) &&
  • !NIL_P(rs) && rs != rb_default_rs) {
  • int i;
  • for (i = 0; i < RSTRING_LEN(rs); i++) {
  • char c = RSTRING_PTR(rs)[i];
  • if (c == 0x1b || 0x20 <= c) {
  • rb_raise(rb_eNotImpError, "gets against dummy encoding is not currently supported");
  • }
  • }
  • }
  • else {
  • rb_raise(rb_eNotImpError, "gets against dummy encoding is not currently supported");
  • } } if (NIL_P(rs)) { str = read_all(fptr, 0, Qnil);

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#9 Updated by Toru Iwase over 6 years ago

=begin

On Wed, 30 Jul 2008 19:10:29 +0900
In article e0b1e5700807300311v13752775mcf8bb5086753051d@mail.gmail.com
[ Re: PENDINGS.rb (Was: Re: Ruby 1.9 - Bug #354 Test failure test/ruby/test_transcode.rb)]
"Yusuke ENDOH" mame@tsg.ne.jp wrote:

これでは改行文字が認識できない可能性があるので、UTF-7 に対する
gets は一切禁止しなければならないと思います。
それならいっそ dummy encoding に対する gets はすべて禁止しちゃえ、
というのが私の意見です。

UTF-7 で (CR)LF がエンコードされていても(当面は?)認識しませんよ、とい
うことでいいんじゃないでしょうか。

# ほんと、UTF-7 て嫌なエンコーディングだ……

--
Tietew tietew@tietew.net
Blog: http://www.tietew.jp/
PGP: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA

=end

#10 Updated by Yusuke Endoh over 6 years ago

=begin
遠藤です。

2008/07/30 20:24 Tanaka Akira akr@fsij.org:

In article e0b1e5700807300311v13752775mcf8bb5086753051d@mail.gmail.com,
"Yusuke ENDOH" mame@tsg.ne.jp writes:

これでは改行文字が認識できない可能性があるので、UTF-7 に対する
gets は一切禁止しなければならないと思います。
それならいっそ dummy encoding に対する gets はすべて禁止しちゃえ、
というのが私の意見です。

ISO-2022-JP でも UTF-7 でも、変換してから改行文字を認識する
ようにすればいいのでは?

なるほど。

そのためには、transcode がもっとまともな変換 API を提供する
必要があります

もう 1.9.1 には間に合わないといわれているので、これは 1.9.2
以降の課題じゃないでしょうか。1.9.1 に間に合えばそれにこした
ことはないですが、落としどころを見つけて仮の仕様としておいた
方がいいと思います。

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#11 Updated by Yusuke Endoh over 6 years ago

=begin
遠藤です。

2008/07/30 19:41 Tietew tietew@tietew.net:

On Wed, 30 Jul 2008 19:10:29 +0900
In article e0b1e5700807300311v13752775mcf8bb5086753051d@mail.gmail.com
[ Re: PENDINGS.rb (Was: Re: Ruby 1.9 - Bug #354 Test failure test/ruby/test_transcode.rb)]
"Yusuke ENDOH" mame@tsg.ne.jp wrote:

これでは改行文字が認識できない可能性があるので、UTF-7 に対する
gets は一切禁止しなければならないと思います。
それならいっそ dummy encoding に対する gets はすべて禁止しちゃえ、
というのが私の意見です。

UTF-7 で (CR)LF がエンコードされていても(当面は?)認識しませんよ、とい
うことでいいんじゃないでしょうか。

なるほど。デリミタを指定した場合はどうでしょうか。

  • デリミタがエンコードされていても認識しませんよ
  • デリミタと同じ文字列がエンコード上で現れたらそこで切りますよ

というのが今までの実装です。私の理解が正しければ。

これが仕様でいいなら、ISO-2022-JP に対する gets が変なところで
切れるのも仕様ってことで、テストを直して終わりです。

個人的には「できないならできない」と言って欲しいですけど。

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#12 Updated by Toru Iwase over 6 years ago

=begin

On Wed, 30 Jul 2008 20:44:36 +0900
In article e0b1e5700807300445q11e6faa2hbd07140bdd837c0d@mail.gmail.com
[ Re: PENDINGS.rb (Was: Re: Ruby 1.9 - Bug #354 Test failure test/ruby/test_transcode.rb)]
"Yusuke ENDOH" mame@tsg.ne.jp wrote:

ISO-2022-JP でも UTF-7 でも、変換してから改行文字を認識する
ようにすればいいのでは?

なるほど。

ruby workaround としては、
open(file, "r:utf-7:utf-8") do |f|
f = StringIO.new(f.read) # 変換
while line = f.gets # ただしく動く
# I am happy
end
end

てな感じですよね。大きいファイルのことは考えていませんが。

そのためには、transcode がもっとまともな変換 API を提供する
必要があります

もう 1.9.1 には間に合わないといわれているので、これは 1.9.2
以降の課題じゃないでしょうか。1.9.1 に間に合えばそれにこした
ことはないですが、落としどころを見つけて仮の仕様としておいた
方がいいと思います。

現状維持(ステートフルのことは考慮外)でいいんじゃないかと思います。
変なところで切れても「あとで直す予定」ということで。

--
Tietew tietew@tietew.net
Blog: http://www.tietew.jp/
PGP: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA

=end

#13 Updated by Yusuke Endoh over 6 years ago

=begin
遠藤です。

2008/07/30 21:39 Tietew tietew@tietew.net:

そのためには、transcode がもっとまともな変換 API を提供する
必要があります

もう 1.9.1 には間に合わないといわれているので、これは 1.9.2
以降の課題じゃないでしょうか。1.9.1 に間に合えばそれにこした
ことはないですが、落としどころを見つけて仮の仕様としておいた
方がいいと思います。

現状維持(ステートフルのことは考慮外)でいいんじゃないかと思います。
変なところで切れても「あとで直す予定」ということで。

常識的なデータに対しては現状でうまく動きそうなので、そのままに
しておいてほしい、ということですかね。
あまり好きじゃないですが、強く反対はしません。
これが採択されるなら、それにあわせてテストを変えようと思います。

ふと思ったのですが、この中途半端な仕様が脆弱性の誘因になることは
ないですよね?

--
Yusuke ENDOH mame@tsg.ne.jp

=end

Also available in: Atom PDF