Putsの不具合

putsで最後の文字ではなく最後のバイトが’\n’かチェックしているため、一部の
エンコーディングで不具合がでます。
test.txtの(9)の後の改行が出力されません。

puts_test.rb:
#!/usr/bin/ruby

-- coding: UTF-8 --

open(“test.txt”,“w:UTF-8”) {|f|
f.puts “(1)test”
f.puts “(2)test”.encode(“UTF-16BE”)
f.puts “(3)日本語”
f.puts “(4)日本語”.encode(“UTF-16BE”)
f.puts “(5)\u0109”
f.puts “(6)\u010a”
f.puts “(7)\u010b”
f.puts “(8)\u0109”.encode(“UTF-16BE”)
f.puts “(9)\u010a”.encode(“UTF-16BE”)
f.puts “(10)\u010b”.encode(“UTF-16BE”)
}

test.txt:
(1)test
(2)test
(3)日本語
(4)日本語
(5)ĉ
(6)ÄŠ
(7)Ä‹
(8)ĉ
(9)ÄŠ(10)Ä‹

文字単位でチェックすると遅いですし、添付のパッチのようにいまの複雑な仕様
をシンプルなものに変えちゃうのもありかと思います。

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:42212] putse$B$NIT6q9ge(B”
on Thu, 9 Sep 2010 14:48:30 +0900, MoonWolf [email protected]
writes:

|putse$B$G:G8e$NJ8;z$G$O$J$/:G8e$N%P%$%H$,e(B’\n’e$B$+%A%'%C%/$7$F$$$k$?$a!"0lIt$Ne(B
|e$B%(%s%3!<%G%#%s%0$GIT6q9g$,$G$^$9!#e(B
|test.txte$B$Ne(B(9)e$B$N8e$N2~9T$,=PNO$5$l$^$;$s!#e(B

e$B$J$k$[$I!#e(B

|e$BJ8;zC10L$G%A%'%C%/$9$k$HCY$$$G$9$7!“E:IU$N%Q%C%A$N$h$&$K$$$^$NJ#;($J;EMMe(B
|e$B$r%7%s%W%k$J$b$N$KJQ$($A$c$&$N$b$”$j$+$H;W$$$^$9!#e(B

e$B%7%s%W%k$KJQ99$9$k$N$bL%NO$J$N$G$9$,!“$3$N%?%$%_%s%0$G$N;EMMe(B
e$BJQ99$O87$7$$$b$N$,$”$j$=$&$J$N$G!"e(Bascii_compate$B$G$J$$;~$@$1J8e(B
e$B;zC10L$G%A%'%C%/$9$k$3$H$K$7$h$&$+$H;W$$$^$9!#e(B