From: "NARUSE, Yui" Date: 2008-06-05T07:16:24+09:00 Subject: [ruby-dev:34931] Re: open() and encodings This is a multi-part message in MIME format. --------------010905050704090908050001 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit 成瀬です。 Yukihiro Matsumoto wrote: > まつもと ゆきひろです > > In message "Re: [ruby-dev:34923] open() and encodings" > on Wed, 4 Jun 2008 08:08:54 +0900, "NARUSE, Yui" writes: > > |Dir.open/entries に関連して、open() 絡みの変更案です。 > | > |まず、ファイルパスについて、現在はファイルシステムのエンコーディングに関らず、 > |与えられたバイナリ列をそのままOSに渡していますが、 > |ファイルシステムのエンコーディングに変換した上で渡した方が親切でしょう。 > > 「ファイルシステムのエンコーディング」って変換して渡せるほど > 信頼できるものなんでしょうか。変換ってのは間違ってると致命的 > ですから。 変換で間違えて読めないのは、実際はそこまで致命的ではないと思うのです。 そのようなケースではどのみちどこかで変換したであろうはずで、 この場合どこで変換しても注意深くしないと読めないものは読めないわけです。 ならば、読めるものは楽に読めた方がいいであろうと。 どちらかといえば気にしていたのは読めてはならないものを読めてしまう場合でしたが、 こちらも結局変換が必要な場合における脅威は増減しないであろうという見解です。 > WindowsやOSXではそうなのかもしれませんが、UNIXではかならずし > もそうでもないような。このパッチではlocaleを採用しているよう > ですが、ひとつのファイルシステムで複数のエンコーディングが混 > 在している場合もありますから、明示的にエンコーディングが指定 > できないとまずいです。というか、むしろ最初から変換してほしく > ありません。 こちらはUNIXにおけるデフォルトがlocaleでは適切とは言えない、 ということでしょうか。 確かに、RedHat系ですと事実上UTF-8がファイルシステムのエンコーディングと言える であろう一方で(正確には/etc/sysconfig/i18nで指定)、 Debianや*BSDではシステム全体のエンコーディングはおそらく決定できません。 と、すると、デフォルトは ASCII-8BIT あたりにして変換しない方がいいのですかねぇ。 > |次に、現在open()はエンコーディングを別にオプションで取ることができません。 > |これも > |open("filename", internal_encoding:"EUC-JP", external_encoding:"Shift_JIS") > |などと取れたほうが便利ではないでしょうか。 > |なお、キー名はとりあえずそのまんま長めの名前にしています。 > |これならば誤解はないであろうし、後でもっと良い名前を思いついたときに変えやすいと思ったので。 > > えーと、IO.readなどの類推からいえば、まず > > open("filename", encoding: "EUC-JP:Shift_JIS") > > の導入が先だろうと思います。で、internal_encodingなどに反対 > するわけではありませんが、その場合にはopen_key_argsも同じオ > プションを受け付けるべきでしょうね。 なるほど。 そのように変更してみました。 -- NARUSE, Yui --------------010905050704090908050001 Content-Type: text/plain; name="open_and_encoding.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="open_and_encoding.patch" LS0tIGVuY29kaW5nLmMJKHJldmlzaW9uIDE2ODIxKQorKysgZW5jb2RpbmcuYwkod29ya2lu ZyBjb3B5KQpAQCAtOTY0LDYgKzk2NCwyMyBAQCByYl9sb2NhbGVfZW5jb2Rpbmcodm9pZCkK ICAgICByZXR1cm4gcmJfZW5jX2Zyb21faW5kZXgoaWR4KTsKIH0KIAorcmJfZW5jb2Rpbmcg KgorcmJfZmlsZXN5c3RlbV9lbmNvZGluZyh2b2lkKQoreworICAgIHN0YXRpYyByYl9lbmNv ZGluZyAqZW5jOworICAgIGlmICghZW5jKSB7CisjaWYgZGVmaW5lZCBfX0FQUExFX18KKwll bmMgPSByYl9lbmNfZmluZCgiVVRGOC1NQUMiKTsKKyNlbGlmIGRlZmluZWQgX1dJTjMyCisg ICAgICAgIC8qIHNpdGxsIHVzZSBBTlNJIGVuY29kaW5nICovCisJZW5jID0gcmJfbG9jYWxl X2VuY29kaW5nKCk7CisjZWxzZQorCWVuYyA9IHJiX2FzY2lpOGJpdF9lbmNvZGluZygpOwor I2VuZGlmCisgICAgfQorICAgIHJldHVybiBlbmM7Cit9CisKIHN0YXRpYyBpbnQgZGVmYXVs dF9leHRlcm5hbF9pbmRleDsKIAogcmJfZW5jb2RpbmcgKgotLS0gaW5jbHVkZS9ydWJ5L2Vu Y29kaW5nLmgJKHJldmlzaW9uIDE2ODIxKQorKysgaW5jbHVkZS9ydWJ5L2VuY29kaW5nLmgJ KHdvcmtpbmcgY29weSkKQEAgLTE2OSw2ICsxNjksNyBAQCByYl9lbmNvZGluZyAqcmJfYXNj aWk4Yml0X2VuY29kaW5nKHZvaWQpCiByYl9lbmNvZGluZyAqcmJfdXRmOF9lbmNvZGluZyh2 b2lkKTsKIHJiX2VuY29kaW5nICpyYl91c2FzY2lpX2VuY29kaW5nKHZvaWQpOwogcmJfZW5j b2RpbmcgKnJiX2xvY2FsZV9lbmNvZGluZyh2b2lkKTsKK3JiX2VuY29kaW5nICpyYl9maWxl c3lzdGVtX2VuY29kaW5nKHZvaWQpOwogcmJfZW5jb2RpbmcgKnJiX2RlZmF1bHRfZXh0ZXJu YWxfZW5jb2Rpbmcodm9pZCk7CiBpbnQgcmJfdXNhc2NpaV9lbmNpbmRleCh2b2lkKTsKIGlu dCByYl9hc2NpaThiaXRfZW5jaW5kZXgodm9pZCk7Ci0tLSBpby5jCShyZXZpc2lvbiAxNjgy MSkKKysrIGlvLmMJKHdvcmtpbmcgY29weSkKQEAgLTEyNSw2ICsxMjUsNyBAQCBWQUxVRSBy Yl9kZWZhdWx0X3JzOwogc3RhdGljIFZBTFVFIGFyZ2Y7CiAKIHN0YXRpYyBJRCBpZF93cml0 ZSwgaWRfcmVhZCwgaWRfZ2V0YywgaWRfZmx1c2gsIGlkX2VuY29kZSwgaWRfcmVhZHBhcnRp YWw7CitzdGF0aWMgVkFMVUUgc3ltX21vZGUsIHN5bV9wZXJtLCBzeW1fZXh0ZW5jLCBzeW1f aW50ZW5jLCBzeW1fZW5jb2RpbmcsIHN5bV9vcGVuX2FyZ3M7CiAKIHN0cnVjdCB0aW1ldmFs IHJiX3RpbWVfaW50ZXJ2YWwoVkFMVUUpOwogCkBAIC00MDE1LDExICs0MDE2LDMxIEBAIHJi X2lvX3NfcG9wZW4oaW50IGFyZ2MsIFZBTFVFICphcmd2LCBWQUwKIHN0YXRpYyBWQUxVRQog cmJfb3Blbl9maWxlKGludCBhcmdjLCBWQUxVRSAqYXJndiwgVkFMVUUgaW8pCiB7Ci0gICAg VkFMVUUgZm5hbWUsIHZtb2RlLCBwZXJtOworICAgIFZBTFVFIG9wdCwgZm5hbWUsIHZtb2Rl LCBwZXJtLCBlbmNvZGluZz1RbmlsLCBleHRlbmM9UW5pbCwgaW50ZW5jPVFuaWw7CiAgICAg Y29uc3QgY2hhciAqbW9kZTsKICAgICBpbnQgZmxhZ3MsIGZtb2RlOworICAgIHJiX2VuY29k aW5nICpmbmFtZV9lbmM7CisgICAgcmJfaW9fdCAqZnB0cjsKKworICAgIG9wdCA9IHJiX2No ZWNrX2NvbnZlcnRfdHlwZShhcmd2W2FyZ2MtMV0sIFRfSEFTSCwgIkhhc2giLCAidG9faGFz aCIpOworICAgIGlmICghTklMX1Aob3B0KSkgeworCVZBTFVFIHY7CisJdiA9IHJiX2hhc2hf YXJlZihvcHQsIHN5bV9tb2RlKTsKKwlpZiAoIU5JTF9QKHYpKSB2bW9kZSA9IHY7CisJdiA9 IHJiX2hhc2hfYXJlZihvcHQsIHN5bV9wZXJtKTsKKwlpZiAoIU5JTF9QKHYpKSBwZXJtID0g djsKKwlhcmdjIC09IDE7CisgICAgfQogCiAgICAgcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3Ys ICIxMiIsICZmbmFtZSwgJnZtb2RlLCAmcGVybSk7CisgICAgZm5hbWVfZW5jID0gcmJfZW5j X2dldChmbmFtZSk7CisgICAgaWYgKHJiX3VzYXNjaWlfZW5jb2RpbmcoKSA9PSBmbmFtZV9l bmMKKwl8fCByYl9hc2NpaThiaXRfZW5jb2RpbmcoKSA9PSBmbmFtZV9lbmMKKyAgICAgICAg fHwgcmJfZmlsZXN5c3RlbV9lbmNvZGluZygpID09IGZuYW1lX2VuYykgeworICAgIH0KKyAg ICBlbHNlIHsKKwlmbmFtZSA9IHJiX3N0cl90cmFuc2NvZGUoZm5hbWUsIHJiX2VuY19mcm9t X2VuY29kaW5nKHJiX2ZpbGVzeXN0ZW1fZW5jb2RpbmcoKSkpOworICAgIH0KICAgICBGaWxl UGF0aFZhbHVlKGZuYW1lKTsKIAogICAgIGlmIChGSVhOVU1fUCh2bW9kZSkgfHwgIU5JTF9Q KHBlcm0pKSB7CkBAIC00MDM1LDEwICs0MDU2LDIzIEBAIHJiX29wZW5fZmlsZShpbnQgYXJn YywgVkFMVUUgKmFyZ3YsIFZBTFUKIAlyYl9maWxlX3N5c29wZW5faW50ZXJuYWwoaW8sIFJT VFJJTkdfUFRSKGZuYW1lKSwgZmxhZ3MsIGZtb2RlKTsKICAgICB9CiAgICAgZWxzZSB7Ci0K IAltb2RlID0gTklMX1Aodm1vZGUpID8gInIiIDogU3RyaW5nVmFsdWVDU3RyKHZtb2RlKTsK IAlyYl9maWxlX29wZW5faW50ZXJuYWwoaW8sIFJTVFJJTkdfUFRSKGZuYW1lKSwgbW9kZSk7 CiAgICAgfQorCisgICAgR2V0T3BlbkZpbGUoaW8sIGZwdHIpOworICAgIGlmICghTklMX1Ao b3B0KSkgeworCVZBTFVFIHYgPSByYl9oYXNoX2FyZWYob3B0LCBzeW1fZW5jb2RpbmcpOwor CWlmICghTklMX1AodikpIHsKKwkgICAgbW9kZV9lbmMoZnB0ciwgU3RyaW5nVmFsdWVDU3Ry KHYpKTsKKwl9CisJZWxzZSB7CisJICAgIHYgPSByYl9oYXNoX2FyZWYob3B0LCBzeW1fZXh0 ZW5jKTsKKwkgICAgaWYgKCFOSUxfUCh2KSkgZnB0ci0+ZW5jID0gcmJfdG9fZW5jb2Rpbmco dik7CisJICAgIHYgPSByYl9oYXNoX2FyZWYob3B0LCBzeW1faW50ZW5jKTsKKwkgICAgaWYg KCFOSUxfUCh2KSkgZnB0ci0+ZW5jMiA9IHJiX3RvX2VuY29kaW5nKHYpOworCX0KKyAgICB9 CiAgICAgcmV0dXJuIGlvOwogfQogCkBAIC02MTQ1LDcgKzYxNzksNyBAQCBzdGF0aWMgdm9p ZAogb3Blbl9rZXlfYXJncyhpbnQgYXJnYywgVkFMVUUgKmFyZ3YsIHN0cnVjdCBmb3JlYWNo X2FyZyAqYXJnKQogewogICAgIFZBTFVFIG9wdCwgdjsKLSAgICBzdGF0aWMgVkFMVUUgZW5j b2RpbmcsIG1vZGUsIG9wZW5fYXJnczsKKyAgICByYl9pb190ICpmcHRyOwogCiAgICAgRmls ZVBhdGhWYWx1ZShhcmd2WzBdKTsKICAgICBhcmctPmlvID0gMDsKQEAgLTYxNjAsMTcgKzYx OTQsOCBAQCBvcGVuX2tleV9hcmdzKGludCBhcmdjLCBWQUxVRSAqYXJndiwgc3RyCiAgICAg aWYgKE5JTF9QKG9wdCkpIGdvdG8gbm9fa2V5OwogICAgIGlmIChhcmdjID4gMikgYXJnLT5h cmdjID0gMTsKICAgICBlbHNlIGFyZy0+YXJnYyA9IDA7Ci0gICAgaWYgKCFlbmNvZGluZykg ewotCUlEIGlkOwogCi0JaWQgPSByYl9pbnRlcm4oImVuY29kaW5nIik7Ci0JZW5jb2Rpbmcg PSBJRDJTWU0oaWQpOwotCWlkID0gcmJfaW50ZXJuKCJtb2RlIik7Ci0JbW9kZSA9IElEMlNZ TShpZCk7Ci0JaWQgPSByYl9pbnRlcm4oIm9wZW5fYXJncyIpOwotCW9wZW5fYXJncyA9IElE MlNZTShpZCk7Ci0gICAgfQotICAgIHYgPSByYl9oYXNoX2FyZWYob3B0LCBvcGVuX2FyZ3Mp OworICAgIHYgPSByYl9oYXNoX2FyZWYob3B0LCBzeW1fb3Blbl9hcmdzKTsKICAgICBpZiAo IU5JTF9QKHYpKSB7CiAJVkFMVUUgYXJnczsKIApAQCAtNjE4Myw3ICs2MjA4LDcgQEAgb3Bl bl9rZXlfYXJncyhpbnQgYXJnYywgVkFMVUUgKmFyZ3YsIHN0cgogCWFyZy0+aW8gPSByYl9p b19vcGVuX3dpdGhfYXJncyhSQVJSQVlfTEVOKGFyZ3MpLCBSQVJSQVlfUFRSKGFyZ3MpKTsK IAlyZXR1cm47CiAgICAgfQotICAgIHYgPSByYl9oYXNoX2FyZWYob3B0LCBtb2RlKTsKKyAg ICB2ID0gcmJfaGFzaF9hcmVmKG9wdCwgc3ltX21vZGUpOwogICAgIGlmICghTklMX1Aodikp IHsKIAlhcmctPmlvID0gcmJfaW9fb3BlbihSU1RSSU5HX1BUUihhcmd2WzBdKSwgU3RyaW5n VmFsdWVDU3RyKHYpKTsKICAgICB9CkBAIC02MTkxLDEyICs2MjE2LDE3IEBAIG9wZW5fa2V5 X2FyZ3MoaW50IGFyZ2MsIFZBTFVFICphcmd2LCBzdHIKIAlhcmctPmlvID0gcmJfaW9fb3Bl bihSU1RSSU5HX1BUUihhcmd2WzBdKSwgInIiKTsKICAgICB9CiAKLSAgICB2ID0gcmJfaGFz aF9hcmVmKG9wdCwgZW5jb2RpbmcpOworICAgIEdldE9wZW5GaWxlKGFyZy0+aW8sIGZwdHIp OworICAgIHYgPSByYl9oYXNoX2FyZWYob3B0LCBzeW1fZW5jb2RpbmcpOwogICAgIGlmICgh TklMX1AodikpIHsKLQlyYl9pb190ICpmcHRyOwotCUdldE9wZW5GaWxlKGFyZy0+aW8sIGZw dHIpOwogICAgICAgICBtb2RlX2VuYyhmcHRyLCBTdHJpbmdWYWx1ZUNTdHIodikpOwogICAg IH0KKyAgICBlbHNlIHsKKwl2ID0gcmJfaGFzaF9hcmVmKG9wdCwgc3ltX2V4dGVuYyk7CisJ aWYgKCFOSUxfUCh2KSkgZnB0ci0+ZW5jID0gcmJfdG9fZW5jb2Rpbmcodik7CisJdiA9IHJi X2hhc2hfYXJlZihvcHQsIHN5bV9pbnRlbmMpOworCWlmICghTklMX1AodikpIGZwdHItPmVu YzIgPSByYl90b19lbmNvZGluZyh2KTsKKyAgICB9CiB9CiAKIHN0YXRpYyBWQUxVRQpAQCAt Nzc0MCw0ICs3NzcwLDExIEBAIEluaXRfSU8odm9pZCkKICNpZmRlZiBPX1NZTkMKICAgICBy Yl9maWxlX2NvbnN0KCJTWU5DIiwgSU5UMkZJWChPX1NZTkMpKTsKICNlbmRpZgorCisgICAg c3ltX21vZGUgPSBJRDJTWU0ocmJfaW50ZXJuKCJtb2RlIikpOworICAgIHN5bV9wZXJtID0g SUQyU1lNKHJiX2ludGVybigicGVybSIpKTsKKyAgICBzeW1fZXh0ZW5jID0gSUQyU1lNKHJi X2ludGVybigiZXh0ZXJuYWxfZW5jb2RpbmciKSk7CisgICAgc3ltX2ludGVuYyA9IElEMlNZ TShyYl9pbnRlcm4oImludGVybmFsX2VuY29kaW5nIikpOworICAgIHN5bV9lbmNvZGluZyA9 IElEMlNZTShyYl9pbnRlcm4oImVuY29kaW5nIikpOworICAgIHN5bV9vcGVuX2FyZ3MgPSBJ RDJTWU0ocmJfaW50ZXJuKCJvcGVuX2FyZ3MiKSk7CiB9Cg== --------------010905050704090908050001--