From: moonwolf@... Date: 2007-03-22T19:37:01+09:00 Subject: [ruby-dev:30670] Re: Unicode対応と文字化け(win32/registry) This is a multi-part message in MIME format. --===BB180060921AA15777069829033771966=== Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit MoonWolfです。 Yukihiro Matsumoto : > |# 別件になりますがユニコード対応してないから文字化けがたまに起きますね。 > |# レジストリをダンプするプログラムを組もうとして嵌りました^^; > > ま、Unicode対応しているとうたってる言語でも文字化けは発生し > てるみたいですしね。で、今回はどのような経緯で文字化けしまし > たか。同じような問題が今後発生しないような仕組みを考えるヒン > トにしたいので、ぜひ教えてください。 Windowsのレジストリ内部は全てユニコードで記録されています。 現状のwin32/registryで呼び出しているANSI版のAPIでは ANSI(CP932)書き込み→内部(UCS2)→ANSI(CP932)読み込みという風になります。 CP932しか使わないのであれば全く問題はありません。 今回発生した文字化けはレジストリのバックアップ/リストア処理で起きました。 レジストリを読み出す段階でCP932に無い文字は'?'に置き換えられてしまいます。 そのため、読み込んだ値をそのまま書き戻すということができませんでした。 とりあえず明示的にユニコードで読み書きするメソッドを追加してみました。 readのUTF-8版としてread_utf8、writeにはwrite_utf8というのを追加しています。 --===BB180060921AA15777069829033771966=== Content-Type: application/octet-stream; name="reg.patch" Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename="reg.patch" SW5kZXg6IHJlZ2lzdHJ5LnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlZ2lzdHJ5LnJiCShyZXZp c2lvbiAxMjExMikKKysrIHJlZ2lzdHJ5LnJiCSh3b3JraW5nIGNvcHkpCkBAIC0zMzAsNiAr MzMwLDQ4IEBACiAgICAgaW5jbHVkZSBDb25zdGFudHMKICAgICBpbmNsdWRlIEVudW1lcmFi bGUKICAgICAKKyAgICAjIFVURi0xNiB0byBVVEYtOAorICAgIGRlZiBzZWxmOjp1MTZ0b3U4 KHUxNnN0cikKKyAgICAgIHU4ID0gJycKKyAgICAgIHN1ciA9IG5pbAorICAgICAgdTE2c3Ry LnVucGFjaygiUyoiKS5lYWNoIHt8eHwKKyAgICAgICAgaWYgc3VyCisgICAgICAgICAgaWYg KDB4ZGMwMC4uMHhkZmZmKS5pbmNsdWRlPyh4KQorICAgICAgICAgICAgc3VyID0gKHggLSAw eGRjMDApICsgMHgxMDAwMAorICAgICAgICAgICAgdTggPDwgW3hdLnBhY2soIlUiKQorICAg ICAgICAgICAgc3VyID0gbmlsCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2Ug IkludmFsaWQgVVRGLTE2IgorICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAg ICAgaWYgKDB4ZDgwMC4uMHhkYmZmKS5pbmNsdWRlPyh4KQorICAgICAgICAgICAgc3VyID0g KHggLSAweGQ4MDApIDw8IDEwCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdTggPDwg W3hdLnBhY2soIlUiKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIH0KKyAg ICAgIHU4LmNob3AKKyAgICBlbmQKKyAgICAKKyAgICAjIFVURi04IHRvIFVURi0xNgorICAg IGRlZiBzZWxmOjp1OHRvdTE2KHU4c3RyKQorICAgICAgYXJ5ID0gdThzdHIudW5wYWNrKCJV KiIpCisgICAgICB1MTYgPSIiCisgICAgICBhcnkuZWFjaCB7fHVjc3wKKyAgICAgICAgY2Fz ZSB1Y3MKKyAgICAgICAgd2hlbiAwLi4weGZmZmYKKyAgICAgICAgICB1MTYgPDwgW3Vjc10u cGFjaygiUyIpCisgICAgICAgIHdoZW4gMHgxMDAwMC4uMHgxMGZmZmYKKyAgICAgICAgICB1 Y3MgLT0gMHgxMDAwMAorICAgICAgICAgIGggPSAodWNzID4+IDEwKSAmIDB4M2ZmICsgMHhk ODAwCisgICAgICAgICAgbCA9IHVjcyAmIDB4M2ZmICsgMHhkYzAwCisgICAgICAgICAgdTE2 IDw8IFtoLGxdLnBhY2soIlNTIikKKyAgICAgICAgZW5kCisgICAgICB9CisgICAgICB1MTYK KyAgICBlbmQKKyAgICAKICAgICAjCiAgICAgIyBFcnJvcgogICAgICMKQEAgLTM4Miw2ICs0 MjQsOCBAQAogICAgICAgICAldy9SZWdFbnVtS2V5RXhBICAgIExMUFBMTExQICAgICBMLywK ICAgICAgICAgJXcvUmVnUXVlcnlWYWx1ZUV4QSBMUExQUFAgICAgICAgTC8sCiAgICAgICAg ICV3L1JlZ1NldFZhbHVlRXhBICAgTFBMTFBMICAgICAgIEwvLAorICAgICAgICAldy9SZWdR dWVyeVZhbHVlRXhXIExQTFBQUCAgICAgICBMLywKKyAgICAgICAgJXcvUmVnU2V0VmFsdWVF eFcgICBMUExMUEwgICAgICAgTC8sCiAgICAgICAgICV3L1JlZ0RlbGV0ZVZhbHVlICAgTFAg ICAgICAgICAgIEwvLAogICAgICAgICAldy9SZWdEZWxldGVLZXkgICAgIExQICAgICAgICAg ICBMLywKICAgICAgICAgJXcvUmVnRmx1c2hLZXkgICAgICBMICAgICAgICAgICAgTC8sCkBA IC00NTMsMTAgKzQ5NywyNiBAQAogICAgICAgICBbIHVucGFja2R3KHR5cGUpLCBkYXRhWzAs IHVucGFja2R3KHNpemUpXSBdCiAgICAgICBlbmQKICAgICAgIAorICAgICAgZGVmIFF1ZXJ5 VmFsdWVXKGhrZXksIG5hbWUpCisgICAgICAgIHR5cGUgPSBwYWNrZHcoMCkKKyAgICAgICAg c2l6ZSA9IHBhY2tkdygwKQorICAgICAgICBuYW1lID0gV2luMzI6OlJlZ2lzdHJ5Ojp1OHRv dTE2KG5hbWUpCisgICAgICAgIGNoZWNrIFJlZ1F1ZXJ5VmFsdWVFeFcuY2FsbChoa2V5LCBu YW1lLCAwLCB0eXBlLCAwLCBzaXplKQorICAgICAgICBkYXRhID0gJ1x4MDBceDAwJyAqIHVu cGFja2R3KHNpemUpCisgICAgICAgIGNoZWNrIFJlZ1F1ZXJ5VmFsdWVFeFcuY2FsbChoa2V5 LCBuYW1lLCAwLCB0eXBlLCBkYXRhLCBzaXplKQorICAgICAgICBbIHVucGFja2R3KHR5cGUp LCBXaW4zMjo6UmVnaXN0cnk6OnUxNnRvdTgoZGF0YVswLCB1bnBhY2tkdyhzaXplKV0pIF0K KyAgICAgIGVuZAorICAgICAgCiAgICAgICBkZWYgU2V0VmFsdWUoaGtleSwgbmFtZSwgdHlw ZSwgZGF0YSwgc2l6ZSkKICAgICAgICAgY2hlY2sgUmVnU2V0VmFsdWVFeEEuY2FsbChoa2V5 LCBuYW1lLCAwLCB0eXBlLCBkYXRhLCBzaXplKQogICAgICAgZW5kCiAgICAgICAKKyAgICAg IGRlZiBTZXRWYWx1ZVcoaGtleSwgbmFtZSwgdHlwZSwgZGF0YSwgc2l6ZSkKKyAgICAgICAg bmFtZSA9IFdpbjMyOjpSZWdpc3RyeTo6dTh0b3UxNihuYW1lKQorICAgICAgICBkYXRhID0g V2luMzI6OlJlZ2lzdHJ5Ojp1OHRvdTE2KGRhdGEpCisgICAgICAgIGNoZWNrIFJlZ1NldFZh bHVlRXhXLmNhbGwoaGtleSwgbmFtZSwgMCwgdHlwZSwgZGF0YSwgZGF0YS5zaXplKQorICAg ICAgZW5kCisgICAgICAKICAgICAgIGRlZiBEZWxldGVWYWx1ZShoa2V5LCBuYW1lKQogICAg ICAgICBjaGVjayBSZWdEZWxldGVWYWx1ZS5jYWxsKGhrZXksIG5hbWUpCiAgICAgICBlbmQK QEAgLTUxMSwxMSArNTcxLDExIEBACiAgICAgZW5kCiAgICAgCiAgICAgZGVmIHNlbGYud3Rp bWUydGltZSh3dGltZSkKLSAgICAgIFRpbWUuYXQoKHd0aW1lIC0gMTE2NDQ0NzM2MDAwMDAw MDAwKSAvIDEwMDAwMDAwKQorICAgICAgVGltZS5hdCgod3RpbWUgLSAxMTY0NDQ3MzYwMDAw MDAwMDApLnF1bygxMDAwMDAwMCkpCiAgICAgZW5kCiAgICAgCiAgICAgZGVmIHNlbGYudGlt ZTJ3dGltZSh0aW1lKQotICAgICAgdGltZS50b19pICogMTAwMDAwMDAgKyAxMTY0NDQ3MzYw MDAwMDAwMDAKKyAgICAgIHRpbWUudG9faSAqIDEwMDAwMDAwICsgdGltZS51c2VjICogMTAg KyAxMTY0NDQ3MzYwMDAwMDAwMDAKICAgICBlbmQKICAgICAKICAgICAjCkBAIC02ODcsNiAr NzQ3LDIxIEBACiAgICAgICBlbmQKICAgICBlbmQKICAgICAKKyAgICBkZWYgcmVhZF91dGY4 KG5hbWUsICpydHlwZSkKKyAgICAgIHR5cGUsIGRhdGEgPSBBUEkuUXVlcnlWYWx1ZVcoQGhr ZXksIG5hbWUpCisgICAgICB1bmxlc3MgcnR5cGUuZW1wdHk/IG9yIHJ0eXBlLmluY2x1ZGU/ KHR5cGUpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIlR5cGUgbWlzbWF0Y2ggKGV4cGVj dCAje3J0eXBlLmluc3BlY3R9IGJ1dCAje3R5cGV9IHByZXNlbnQpIgorICAgICAgZW5kCisg ICAgICBjYXNlIHR5cGUKKyAgICAgIHdoZW4gUkVHX1NaLCBSRUdfRVhQQU5EX1NaCisgICAg ICAgIFsgdHlwZSwgZGF0YSBdCisgICAgICB3aGVuIFJFR19NVUxUSV9TWgorICAgICAgICBb IHR5cGUsIGRhdGEuc3BsaXQoL1wwLykgXQorICAgICAgZWxzZQorICAgICAgICByZWFkKG5h bWUsICpydHlwZSkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAogICAgIGRlZiBbXShuYW1l LCAqcnR5cGUpCiAgICAgICB0eXBlLCBkYXRhID0gcmVhZChuYW1lLCAqcnR5cGUpCiAgICAg ICBjYXNlIHR5cGUKQEAgLTcwMiw2ICs3NzcsMTQgQEAKICAgICBkZWYgcmVhZF9zKG5hbWUp CiAgICAgICByZWFkKG5hbWUsIFJFR19TWilbMV0KICAgICBlbmQKKworICAgIGRlZiByZWFk X3NfdXRmOChuYW1lKQorICAgICAgdHlwZSwgZGF0YSA9IEFQSS5RdWVyeVZhbHVlVyhAaGtl eSwgbmFtZSkKKyAgICAgIGlmIHR5cGUgIT0gUkVHX1NaCisgICAgICAgIHJhaXNlIFR5cGVF cnJvciwgIlR5cGUgbWlzbWF0Y2ggKCN7dHlwZX0gcHJlc2VudCkiCisgICAgICBlbmQKKyAg ICAgIGRhdGEKKyAgICBlbmQKICAgICAKICAgICBkZWYgcmVhZF9zX2V4cGFuZChuYW1lKQog ICAgICAgdHlwZSwgZGF0YSA9IHJlYWQobmFtZSwgUkVHX1NaLCBSRUdfRVhQQU5EX1NaKQpA QCAtNzEyLDYgKzc5NSwxNSBAQAogICAgICAgZW5kCiAgICAgZW5kCiAgICAgCisgICAgZGVm IHJlYWRfc19leHBhbmRfdXRmOChuYW1lKQorICAgICAgdHlwZSwgZGF0YSA9IEFQSS5RdWVy eVZhbHVlVyhAaGtleSwgbmFtZSkKKyAgICAgIGlmIHR5cGUgPT0gUkVHX0VYUEFORF9TWgor ICAgICAgICBSZWdpc3RyeS5leHBhbmRfZW52aXJvbihkYXRhKQorICAgICAgZWxzZQorICAg ICAgICBkYXRhCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKICAgICBkZWYgcmVhZF9pKG5h bWUpCiAgICAgICByZWFkKG5hbWUsIFJFR19EV09SRCwgUkVHX0RXT1JEX0JJR19FTkRJQU4s IFJFR19RV09SRClbMV0KICAgICBlbmQKQEAgLTc0Miw3ICs4MzQsMzAgQEAKICAgICAgIGVu ZAogICAgICAgQVBJLlNldFZhbHVlKEBoa2V5LCBuYW1lLCB0eXBlLCBkYXRhLCBkYXRhLmxl bmd0aCkKICAgICBlbmQKLSAgICAKKworICAgIGRlZiB3cml0ZV91dGY4KG5hbWUsIHR5cGUs IGRhdGEpCisgICAgICBjYXNlIHR5cGUKKyAgICAgIHdoZW4gUkVHX1NaLCBSRUdfRVhQQU5E X1NaCisgICAgICAgIEFQSS5TZXRWYWx1ZVcoQGhrZXksIG5hbWUsIHR5cGUsIGRhdGEsIGRh dGEubGVuZ3RoKQorICAgICAgd2hlbiBSRUdfTVVMVElfU1oKKyAgICAgICAgQVBJLlNldFZh bHVlVyhAaGtleSwgbmFtZSwgdHlwZSwgZGF0YSwgZGF0YS5sZW5ndGgpCisgICAgICB3aGVu IFJFR19CSU5BUlkKKyAgICAgICAgZGF0YSA9IGRhdGEudG9fcworICAgICAgICBBUEkuU2V0 VmFsdWUoQGhrZXksIG5hbWUsIHR5cGUsIGRhdGEsIGRhdGEubGVuZ3RoKQorICAgICAgd2hl biBSRUdfRFdPUkQKKyAgICAgICAgZGF0YSA9IEFQSS5wYWNrZHcoZGF0YS50b19pKQorICAg ICAgICBBUEkuU2V0VmFsdWUoQGhrZXksIG5hbWUsIHR5cGUsIGRhdGEsIGRhdGEubGVuZ3Ro KQorICAgICAgd2hlbiBSRUdfRFdPUkRfQklHX0VORElBTgorICAgICAgICBkYXRhID0gW2Rh dGEudG9faV0ucGFjaygnTicpCisgICAgICAgIEFQSS5TZXRWYWx1ZShAaGtleSwgbmFtZSwg dHlwZSwgZGF0YSwgZGF0YS5sZW5ndGgpCisgICAgICB3aGVuIFJFR19RV09SRAorICAgICAg ICBkYXRhID0gQVBJLnBhY2txdyhkYXRhLnRvX2kpCisgICAgICAgIEFQSS5TZXRWYWx1ZShA aGtleSwgbmFtZSwgdHlwZSwgZGF0YSwgZGF0YS5sZW5ndGgpCisgICAgICBlbHNlCisgICAg ICAgIHJhaXNlIFR5cGVFcnJvciwgIlVuc3VwcG9ydGVkIHR5cGUgI3t0eXBlfSIKKyAgICAg IGVuZAorICAgIGVuZAorCiAgICAgZGVmIFtdPShuYW1lLCBydHlwZSwgdmFsdWUgPSBuaWwp CiAgICAgICBpZiB2YWx1ZQogICAgICAgICB3cml0ZSBuYW1lLCBydHlwZSwgdmFsdWUKQEAg LTc2NSw2ICs4ODAsMTAgQEAKICAgICAgIHdyaXRlIG5hbWUsIFJFR19TWiwgdmFsdWUudG9f cwogICAgIGVuZAogICAgIAorICAgIGRlZiB3cml0ZV9zX3V0ZjgobmFtZSwgdmFsdWUpCisg ICAgICB3cml0ZV91dGY4IG5hbWUsIFJFR19TWiwgdmFsdWUudG9fcworICAgIGVuZAorICAg IAogICAgIGRlZiB3cml0ZV9pKG5hbWUsIHZhbHVlKQogICAgICAgd3JpdGUgbmFtZSwgUkVH X0RXT1JELCB2YWx1ZS50b19pCiAgICAgZW5kCg== --===BB180060921AA15777069829033771966===--