ASCII-8BITへの変換をどうする的な話

@frsyukiの疑問から始まった流れを追いたくて、関連するツイートをかき集めました。せっかくなので公開します。
2
Yukihiro Matz @yukihiro_matz

@tanaka_akr @frsyuki @kosaki55tea @nalsh 出口がなければ変なことにはならないと思うのですが、 甘い?

2012-06-23 17:04:46
Tanaka Akira @tanaka_akr

@yukihiro_matz @nalsh ASCII-8BIT の 0x80 - 0xff はバイナリを表現するために用意された特殊文字でいうだけで、マジカルとは思いませんね。UTF-8 との文字コード変換で失敗するのは、UTF-8 にはそれらの特殊文字が存在しないから。

2012-06-23 17:14:09
Tanaka Akira @tanaka_akr

@yukihiro_matz @frsyuki @kosaki55tea @nalsh 片方向にすると、なんで逆方向の変換はできないんだという文句がきそう。

2012-06-23 17:17:57
Yukihiro Matz @yukihiro_matz

@tanaka_akr @frsyuki @kosaki55tea @nalsh まあ、その文句は想像できますが、情報が失われる変換は不可逆というのは妥協できるのでは?

2012-06-23 17:34:57
Tanaka Akira @tanaka_akr

@nalsh @yukihiro_matz @frsyuki @kosaki55tea やるなら IO 側だろう。単に書き込み時に ASCII-8BIT なら変換をやらなければいい。

2012-06-23 17:35:29
Yukihiro Matz @yukihiro_matz

不可逆なエンコーディング変換って、ほかに存在しないか。可逆性を仮定してる部分があれば、@tanaka_akr のいう通りIOで対応した方がいいかもね。

2012-06-23 17:40:43
Yukihiro Matz @yukihiro_matz

でも、できればString#encodeで対応したい。

2012-06-23 17:42:30
成瀬 @nalsh

@yukihiro_matz @tanaka_akr Windows-31JやUTF8-MACの多対一(両者で意味違う)とかは落ちますね。BINARYはエンコーディング情報が落ちるってあたりがだいぶ違いますが

2012-06-23 17:43:18
Tanaka Akira @tanaka_akr

@yukihiro_matz なんで String#encode で対応したいの?

2012-06-23 18:38:02
Yukihiro Matz @yukihiro_matz

@tanaka_akr String#encode(BINARY) を救済したい。悪くないAPIだと思うし。

2012-06-23 19:04:31
Tanaka Akira @tanaka_akr

@yukihiro_matz 文字を保存しないのを String#encode と呼ぶのは基本から外れていて良くない API だと思いますが、どうしてもというなら、変換器をつけくわえるよりは encode メソッドの中に例外処理を入れる方がマシでしょう。逆方向にも対応できるし。

2012-06-23 19:10:34
Yukihiro Matz @yukihiro_matz

@tanaka_akr 逆方向にどうやって対応しますか?

2012-06-23 19:19:59
Tanaka Akira @tanaka_akr

@yukihiro_matz str.encode(enc) で、str.encoding が ASCII-8BIT な場合 str.dup.force_encoding(enc) 相当の動作にすればいいでしょう。

2012-06-23 19:27:18
Yukihiro Matz @yukihiro_matz

@tanaka_akr それは順方向ですよね。そっちはわかるんですけど、逆方向って何をするのかな、と。

2012-06-23 19:47:55
Tanaka Akira @tanaka_akr

@yukihiro_matz String#encode(BINARY) が順方向と想定してその逆を述べました。どちらでもかまいませんが str.encode(enc) で str と enc の片方が ASCII-8BIT の場合は force_encoding ということです

2012-06-23 19:53:15
Yukihiro Matz @yukihiro_matz

@tanaka_akr ああ、そうか。勘違いしてました。確かに逆方向ですね。でも、そっちはエラーにした方がいいんじゃないかな。

2012-06-23 19:56:06
Tanaka Akira @tanaka_akr

@yukihiro_matz もちろん私は両方ともエラーの方がいいと思っていますが、片方だけをエラーにしたいという非対称性はどのような意図でしょう?

2012-06-23 19:59:21
Yukihiro Matz @yukihiro_matz

@tanaka_akr BINARYへの変換は意図的に情報が落とす変換ですが、BINARYからの変換は情報を壊してるかもしれない(正しさの保証がない)からでしょうか。あ、でも force_encoding の後に valid_encoding? で確認すれば、実害はないのかな。

2012-06-23 22:44:27
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@tanaka_akr @nalsh @yukihiro_matz @frsyuki IO側で対処はリーズナブルな解だと思います。IOにASCII_8BITがつくのってたぶん自分で明示したときだけなので、おまえの意図をエスパーしました。といういつもの理論で

2012-06-24 05:11:21
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@tanaka_akr @nalsh @yukihiro_matz @frsyuki あと感覚的には force_encoding は名前の失敗感が。set_encodingだと例外あがるケースを強制的に変換みたいな名前イメージだけど実体は reinterpret だよね

2012-06-24 05:12:39
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

バイナリアンすっげーーー RT @nalsh: バイナリアン的には、BINARYは可変長のまじかるエンコーディングだという見解なのだとしたら変換できてしまうのかもしれない

2012-06-24 05:29:34
成瀬 @nalsh

@kosaki55tea @tanaka_akr @yukihiro_matz @frsyuki 実は、まったく何もしなかったときは set_encoding(nil) 相当の状態のはずなのです

2012-06-24 12:01:01
成瀬 @nalsh

@kosaki55tea @tanaka_akr @yukihiro_matz @frsyuki String#encoding= や String#reset_encoding ってネタは長らく温めていますねぇ

2012-06-24 12:02:05
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@nalsh @tanaka_akr @yukihiro_matz @frsyuki あー、うん。でも set_encoding(nil) と set_encoding(BINARY) の動作が全然違うのは直感的じゃないという立場からするとあんまりフォローになってない気がする

2012-06-24 15:29:24