[#32945] Shift_JIS variants and UTF-16 support — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

22 messages 2008/01/07
[#32953] Re: Shift_JIS variants and UTF-16 support — Martin Duerst <duerst@...> 2008/01/07

中村さん、こんにちは。

[#32955] Re: Shift_JIS variants and UTF-16 support — Yukihiro Matsumoto <matz@...> 2008/01/07

まつもと ゆきひろです

[#32959] Re: Shift_JIS variants and UTF-16 support — "NARUSE, Yui" <naruse@...> 2008/01/07

成瀬です。

[#32960] Re: Shift_JIS variants and UTF-16 support — Yukihiro Matsumoto <matz@...> 2008/01/07

まつもと ゆきひろです

[#32992] ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...>

成瀬です。

18 messages 2008/01/08
[#32994] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Yukihiro Matsumoto <matz@...> 2008/01/09

まつもと ゆきひろです

[#32995] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Martin Duerst <duerst@...> 2008/01/09

At 18:13 08/01/09, Yukihiro Matsumoto wrote:

[#33011] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...> 2008/01/11

成瀬です。

[#33012] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Yukihiro Matsumoto <matz@...> 2008/01/11

まつもと ゆきひろです

[#33014] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...> 2008/01/11

成瀬です。

[#33015] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Yukihiro Matsumoto <matz@...> 2008/01/11

まつもと ゆきひろです

[#33239] Re: [ruby-cvs:22386] Ruby:r15149 (trunk): * string.c (rb_str_each_char): move forward. — Tanaka Akira <akr@...>

In article <200801210259.m0L2x3CW017171@ci.ruby-lang.org>,

11 messages 2008/01/21
[#33240] Re: [ruby-cvs:22386] Ruby:r15149 (trunk): * string.c (rb_str_each_char): move forward. — Nobuyoshi Nakada <nobu@...> 2008/01/21

なかだです。

[#33303] Time#strftimeのエンコーディング — rubikitch@...

るびきちです。

13 messages 2008/01/23
[#33305] Re: Time#strftimeのエンコーディング — Yukihiro Matsumoto <matz@...> 2008/01/23

まつもと ゆきひろです

[#33368] summary of script encoding — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

22 messages 2008/01/25
[#33375] Re: summary of script encoding — Yukihiro Matsumoto <matz@...> 2008/01/25

まつもと ゆきひろです

[#33376] Re: summary of script encoding — "U.Nakamura" <usa@...> 2008/01/25

こんにちは、なかむら(う)です。

[#33387] HashからStructを作る — rubikitch@...

るびきちです。

19 messages 2008/01/25
[#33455] Re: HashからStructを作る — Yukihiro Matsumoto <matz@...> 2008/01/28

まつもと ゆきひろです

[#33505] Re: HashからStructを作る — rubikitch@... 2008/01/29

From: Yukihiro Matsumoto <matz@ruby-lang.org>

[#33507] Re: HashからStructを作る — Yukihiro Matsumoto <matz@...> 2008/01/29

まつもと ゆきひろです

[#33508] Re: HashからStructを作る — rubikitch@... 2008/01/29

From: Yukihiro Matsumoto <matz@ruby-lang.org>

[#33433] Win32OLE: set encoding to OLE string — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

16 messages 2008/01/28

[#33461] Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...>

=1B$B?9ED$H?=3D$7$^$9!#=1B(B

19 messages 2008/01/28
[#33473] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Nobuyoshi Nakada <nobu@...> 2008/01/28

なかだです。

[#33503] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/29

森田です。

[#33514] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Nobuyoshi Nakada <nobu@...> 2008/01/29

なかだです。

[#33518] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/30

森田です。

[#33545] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Ryutaro Amano <wn9r-amn@...> 2008/01/31

天野竜太郎と申します。

[#33546] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/31

森田です。

[#33547] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Ryutaro Amano <wn9r-amn@...> 2008/01/31

天野です。

[#33551] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/31

森田です。

[#33488] 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

20 messages 2008/01/29
[#33491] Re: 現在の script encoding の値を得る方法は? — Yukihiro Matsumoto <matz@...> 2008/01/29

まつもと ゆきひろです

[#33500] Re: 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...> 2008/01/29

永井@知能.九工大です.

[#33501] Re: 現在の script encoding の値を得る方法は? — "NARUSE, Yui" <naruse@...> 2008/01/29

成瀬です。

[#33515] Re: 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...> 2008/01/30

永井@知能.九工大です.

[#33516] Re: 現在の script encoding の値を得る方法は? — "NARUSE, Yui" <naruse@...> 2008/01/30

成瀬です。

[#33519] Re: 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...> 2008/01/30

永井@知能.九工大です.

[#33522] Re: 現在の script encoding の値を得る方法は? — "NARUSE, Yui" <naruse@...> 2008/01/30

成瀬です。

[ruby-dev:33453] Re: Win32OLE: set encoding to OLE string

From: "U.Nakamura" <usa@...>
Date: 2008-01-28 08:31:20 UTC
List: ruby-dev #33453
こんにちは、なかむら(う)です。

In message "[ruby-dev:33446] Re: Win32OLE: set encoding to OLE string"
    on Jan.28,2008 15:44:11, <usa@garbagecollect.jp> wrote:
| | あと、WIN32OLE.codepage= で、CP_ACP以外のコードページを
| | 指定されていた場合、無条件に、rb_locale_encoding()するのは
| | まずくないんでしょうか?
| 
| ... が、コードページが指定可能とは気づいてなかったです。
| ということは、rb_locale_charmap()相当の処理をかます必要がある
| でしょうね。
| まいったな。

してみました。

ACP、OEMCP、MACCPは途中で変わるわけはあるまいということを期待
してます。
THREAD_ACPは、名前からすると変わりそうな気がしますが、とりあ
えず変わらないと信じることにしました。
rubyが知らないcodepageが来たらdummy encodingが登録されるよう
になっていますが、まあ実際に使用されるencodingはほとんど知っ
てるはずなのでこんなもんで。
# CP_UTF7とCP_UTF8は、実は今はrubyは知らないんですが、後で追
# 加しておきます。

Index: ext/win32ole/win32ole.c
===================================================================
--- ext/win32ole/win32ole.c	(revision 15288)
+++ ext/win32ole/win32ole.c	(working copy)
@@ -17,6 +17,7 @@
 
 #include "ruby/ruby.h"
 #include "ruby/st.h"
+#include "ruby/encoding.h"
 #include <ctype.h>
 #include <windows.h>
 #include <ocidl.h>
@@ -195,7 +196,8 @@ static FNCOCREATEINSTANCEEX *gCoCreateIn
 static VALUE com_hash;
 static IDispatchVtbl com_vtbl;
 static UINT cWIN32OLE_cp = CP_ACP;
-static LCID cWIN32OLE_lcid = LOCALE_SYSTEM_DEFAULT; 
+static LCID cWIN32OLE_lcid = LOCALE_SYSTEM_DEFAULT;
+static rb_encoding *cWIN32OLE_enc;
 static UINT g_cp_to_check = CP_ACP;
 static char g_lcid_to_check[8 + 1];
 static VARTYPE g_nil_to = VT_ERROR;
@@ -766,6 +768,67 @@ date2time_str(double date)
     return rb_str_new2(szTime);
 }
 
+struct myCPINFOEX {
+  UINT MaxCharSize;
+  BYTE DefaultChar[2];
+  BYTE LeadByte[12];
+  WCHAR UnicodeDefaultChar;
+  UINT CodePage;
+  char CodePageName[MAX_PATH];
+};
+
+static rb_encoding *
+ole_cp2encoding(UINT cp)
+{
+    static BOOL (*pGetCPInfoEx)(UINT, DWORD, struct myCPINFOEX *) = NULL;
+    struct myCPINFOEX* buf;
+    VALUE enc_name;
+    char *enc_cstr;
+    int idx;
+
+    if (!code_page_installed(cp)) {
+	switch(cp) {
+	  case CP_ACP:
+	    cp = GetACP();
+	    break;
+	  case CP_OEMCP:
+	    cp = GetOEMCP();
+	    break;
+	  case CP_MACCP:
+	  case CP_THREAD_ACP:
+	    if (!pGetCPInfoEx) {
+		pGetCPInfoEx = (BOOL (*)(UINT, DWORD, LPVOID))
+		    GetProcAddress(GetModuleHandle("kernel32"), "GetCPInfoEx");
+		if (!pGetCPInfoEx) {
+		    pGetCPInfoEx = (void*)-1;
+		}
+	    }
+	    buf = ALLOCA_N(struct myCPINFOEX, 1);
+	    ZeroMemory(buf, sizeof(struct myCPINFOEX));
+	    if (pGetCPInfoEx == (void*)-1 || !pGetCPInfoEx(cp, 0, buf)) {
+		rb_raise(eWIN32OLERuntimeError, "cannot map codepage to encoding.");
+		break;	/* never reach here */
+	    }
+	    cp = buf->CodePage;
+	    break;
+	  case CP_SYMBOL:
+	  case CP_UTF7:
+	  case CP_UTF8:
+	    // nothing ToDo
+	    break;
+	  default:
+            rb_raise(eWIN32OLERuntimeError, "codepage should be WIN32OLE::CP_ACP, WIN32OLE::CP_OEMCP, WIN32OLE::CP_MACCP, WIN32OLE::CP_THREAD_ACP, WIN32OLE::CP_SYMBOL, WIN32OLE::CP_UTF7, WIN32OLE::CP_UTF8, or installed codepage.");
+            break;
+        }
+    }
+
+    enc_name = rb_sprintf("CP%d", cp);
+    idx = rb_enc_find_index(enc_cstr = StringValueCStr(enc_name));
+    if (idx < 0)
+	idx = rb_define_dummy_encoding(enc_cstr);
+    return rb_enc_from_index(idx);
+}
+
 static char *
 ole_wc2mb(LPWSTR pw)
 {
@@ -967,7 +1030,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), cWIN32OLE_enc);
     if(isfree)
         SysFreeString(pw);
     free(p);
@@ -1809,13 +1872,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 +1952,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;
@@ -2630,6 +2688,7 @@ fole_s_set_code_page(VALUE self, VALUE v
             break;
         }
     }
+    cWIN32OLE_enc = ole_cp2encoding(cWIN32OLE_cp);
     /*
      * Should this method return old codepage?
      */
@@ -3613,12 +3672,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, cWIN32OLE_enc);
 
         return ole_propertyput(self, argv[0], argv[1]);
     }
     else {
-        argv[0] = rb_str_new2(mname);
+        argv[0] = rb_enc_str_new(mname, n, cWIN32OLE_enc);
         return ole_invoke(argc, argv, self, DISPATCH_METHOD|DISPATCH_PROPERTYGET, FALSE);
     }
 }
@@ -8167,4 +8226,5 @@ Init_win32ole()
 
     eWIN32OLERuntimeError = rb_define_class("WIN32OLERuntimeError", rb_eRuntimeError);
 
+    cWIN32OLE_enc = ole_cp2encoding(cWIN32OLE_cp);
 }

それでは。
-- 
U.Nakamura <usa@garbagecollect.jp>



In This Thread