ASCII-8BITへの変換をどうする的な話
@tanaka_akr @frsyuki @kosaki55tea @nalsh 出口がなければ変なことにはならないと思うのですが、 甘い?
2012-06-23 17:04:46@yukihiro_matz @nalsh ASCII-8BIT の 0x80 - 0xff はバイナリを表現するために用意された特殊文字でいうだけで、マジカルとは思いませんね。UTF-8 との文字コード変換で失敗するのは、UTF-8 にはそれらの特殊文字が存在しないから。
2012-06-23 17:14:09@yukihiro_matz @frsyuki @kosaki55tea @nalsh 片方向にすると、なんで逆方向の変換はできないんだという文句がきそう。
2012-06-23 17:17:57@tanaka_akr @frsyuki @kosaki55tea @nalsh まあ、その文句は想像できますが、情報が失われる変換は不可逆というのは妥協できるのでは?
2012-06-23 17:34:57@nalsh @yukihiro_matz @frsyuki @kosaki55tea やるなら IO 側だろう。単に書き込み時に ASCII-8BIT なら変換をやらなければいい。
2012-06-23 17:35:29不可逆なエンコーディング変換って、ほかに存在しないか。可逆性を仮定してる部分があれば、@tanaka_akr のいう通りIOで対応した方がいいかもね。
2012-06-23 17:40:43@yukihiro_matz @tanaka_akr Windows-31JやUTF8-MACの多対一(両者で意味違う)とかは落ちますね。BINARYはエンコーディング情報が落ちるってあたりがだいぶ違いますが
2012-06-23 17:43:18@tanaka_akr String#encode(BINARY) を救済したい。悪くないAPIだと思うし。
2012-06-23 19:04:31@yukihiro_matz 文字を保存しないのを String#encode と呼ぶのは基本から外れていて良くない API だと思いますが、どうしてもというなら、変換器をつけくわえるよりは encode メソッドの中に例外処理を入れる方がマシでしょう。逆方向にも対応できるし。
2012-06-23 19:10:34@yukihiro_matz str.encode(enc) で、str.encoding が ASCII-8BIT な場合 str.dup.force_encoding(enc) 相当の動作にすればいいでしょう。
2012-06-23 19:27:18@tanaka_akr それは順方向ですよね。そっちはわかるんですけど、逆方向って何をするのかな、と。
2012-06-23 19:47:55@yukihiro_matz String#encode(BINARY) が順方向と想定してその逆を述べました。どちらでもかまいませんが str.encode(enc) で str と enc の片方が ASCII-8BIT の場合は force_encoding ということです
2012-06-23 19:53:15@tanaka_akr ああ、そうか。勘違いしてました。確かに逆方向ですね。でも、そっちはエラーにした方がいいんじゃないかな。
2012-06-23 19:56:06@yukihiro_matz もちろん私は両方ともエラーの方がいいと思っていますが、片方だけをエラーにしたいという非対称性はどのような意図でしょう?
2012-06-23 19:59:21@tanaka_akr BINARYへの変換は意図的に情報が落とす変換ですが、BINARYからの変換は情報を壊してるかもしれない(正しさの保証がない)からでしょうか。あ、でも force_encoding の後に valid_encoding? で確認すれば、実害はないのかな。
2012-06-23 22:44:27@tanaka_akr @nalsh @yukihiro_matz @frsyuki IO側で対処はリーズナブルな解だと思います。IOにASCII_8BITがつくのってたぶん自分で明示したときだけなので、おまえの意図をエスパーしました。といういつもの理論で
2012-06-24 05:11:21@tanaka_akr @nalsh @yukihiro_matz @frsyuki あと感覚的には force_encoding は名前の失敗感が。set_encodingだと例外あがるケースを強制的に変換みたいな名前イメージだけど実体は reinterpret だよね
2012-06-24 05:12:39バイナリアンすっげーーー RT @nalsh: バイナリアン的には、BINARYは可変長のまじかるエンコーディングだという見解なのだとしたら変換できてしまうのかもしれない
2012-06-24 05:29:34@kosaki55tea @tanaka_akr @yukihiro_matz @frsyuki 実は、まったく何もしなかったときは set_encoding(nil) 相当の状態のはずなのです
2012-06-24 12:01:01@kosaki55tea @tanaka_akr @yukihiro_matz @frsyuki String#encoding= や String#reset_encoding ってネタは長らく温めていますねぇ
2012-06-24 12:02:05@nalsh @tanaka_akr @yukihiro_matz @frsyuki あー、うん。でも set_encoding(nil) と set_encoding(BINARY) の動作が全然違うのは直感的じゃないという立場からするとあんまりフォローになってない気がする
2012-06-24 15:29:24