From: "U.Nakamura" Date: 2008-01-28T11:13:33+09:00 Subject: [ruby-dev:33433] Win32OLE: set encoding to OLE string こんにちは、なかむら(う)です。 Win32OLEで、OLE経由で取得した文字列にencodingを設定するパッチ を作ってみました。 これで十分かどうかはちょっと自信ないですが、ふだん私が使って るスクリプトはこれでうまくいくようです。 で、まあ、これはこれとして、wc2mbしないでそのままWSTRをUTF-16LE に返すようなことも将来は考えるべきなんですかねえ。 ruby本体側もですが。 Index: ext/win32ole/win32ole.c =================================================================== --- ext/win32ole/win32ole.c (revision 15282) +++ ext/win32ole/win32ole.c (working copy) @@ -17,6 +17,7 @@ #include "ruby/ruby.h" #include "ruby/st.h" +#include "ruby/encoding.h" #include #include #include @@ -967,7 +968,7 @@ static VALUE ole_wc2vstr(LPWSTR pw, BOOL isfree) { char *p = ole_wc2mb(pw); - VALUE vstr = rb_str_new2(p); + VALUE vstr = rb_enc_str_new(p, strlen(p), rb_locale_encoding()); if(isfree) SysFreeString(pw); free(p); @@ -1809,13 +1810,10 @@ ole_variant2val(VARIANT *pvar) case VT_BSTR: { - char *p; if(V_ISBYREF(pvar)) - p = ole_wc2mb(*V_BSTRREF(pvar)); + obj = ole_wc2vstr(*V_BSTRREF(pvar), FALSE); else - p = ole_wc2mb(V_BSTR(pvar)); - obj = rb_str_new2(p); - if(p) free(p); + obj = ole_wc2vstr(V_BSTR(pvar), FALSE); break; } @@ -1892,9 +1890,7 @@ ole_variant2val(VARIANT *pvar) hr = VariantChangeTypeEx(&variant, pvar, cWIN32OLE_lcid, 0, VT_BSTR); if (SUCCEEDED(hr) && V_VT(&variant) == VT_BSTR) { - char *p = ole_wc2mb(V_BSTR(&variant)); - obj = rb_str_new2(p); - if(p) free(p); + obj = ole_wc2vstr(V_BSTR(&variant), FALSE); } VariantClear(&variant); break; @@ -3613,12 +3609,12 @@ fole_missing(int argc, VALUE *argv, VALU } n = strlen(mname); if(mname[n-1] == '=') { - argv[0] = rb_str_new(mname, n-1); + argv[0] = rb_enc_str_new(mname, n-1, rb_locale_encoding()); return ole_propertyput(self, argv[0], argv[1]); } else { - argv[0] = rb_str_new2(mname); + argv[0] = rb_enc_str_new(mname, n, rb_locale_encoding()); return ole_invoke(argc, argv, self, DISPATCH_METHOD|DISPATCH_PROPERTYGET, FALSE); } } それでは。 -- U.Nakamura