Win32OLE: set encoding to OLE string

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

Win32OLEe$B$G!“e(BOLEe$B7PM3$G<hF@$7$?J8;zNs$Ke(Bencodinge$B$r@Dj$9$k%Q%C%Ae(B
e$B$r:n$C$F$
$^$7$?!#e(B
e$B$3$l$G==J,$+$I$&$+$O$A$g$C$H<+?.$J$$$G$9$,!”$U$@$s;d$,;H$C$Fe(B
e$B$k%9%/%j%W%H$O$3$l$G$&$^$/$$$/$h$&$G$9!#e(B

e$B$G!"$^$"!"$3$l$O$3$l$H$7$F!"e(Bwc2mbe$B$7$J$$$G$=$N$^$^e(BWSTRe$B$re(BUTF-16LE
e$B$KJV$9$h$&$J$3$H$b>-Mh$O9M$($k$Y$-$J$s$G$9$+$M$(!#e(B
rubye$BK\BNB&$b$G$9$,!#e(B

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 <ctype.h>
#include <windows.h>
#include <ocidl.h>
@@ -967,7 +968,7 @@ static VALUE
ole_wc2vstr(LPWSTR pw, BOOL isfree)
{
char *p = ole_wc2mb(pw);

  • VALUE vstr = rb_str_new2§;
  • VALUE vstr = rb_enc_str_new(p, strlen§, rb_locale_encoding());
    if(isfree)
    SysFreeString(pw);
    free§;
    @@ -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);
}
}

e$B$=$l$G$O!#e(B

e$B@.@%$G$9!#e(B

U.Nakamura wrote:

e$B$G!"$^$"!"$3$l$O$3$l$H$7$F!"e(Bwc2mbe$B$7$J$$$G$=$N$^$^e(BWSTRe$B$re(BUTF-16LE
e$B$KJV$9$h$&$J$3$H$b>-Mh$O9M$($k$Y$-$J$s$G$9$+$M$(!#e(B
rubye$BK\BNB&$b$G$9$,!#e(B

e$B?tG/A0$+$i$N7|0F$G$9$M$’!"M_$7$$$H;W$$$^$9!#e(B

e$B$H$3$m$G!"e(BUTF-16LE e$B$G$J$/!“e(Bpack e$B$”$?$j$K$D$C$3$s$Ge(B
UTF-8 e$B$NJ}$,;H$$$d$9e(B
e$B$+$C$F$j$7$^$;$s$+!#e(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:33435] Re: Win32OLE: set encoding to OLE string”
on Jan.28,2008 11:38:16, [email protected] wrote:
| > e$B$G!“$^$”!"$3$l$O$3$l$H$7$F!"e(Bwc2mbe$B$7$J$$$G$=$N$^$^e(BWSTRe$B$re(BUTF-16LE
| > e$B$KJV$9$h$&$J$3$H$b>-Mh$O9M$($k$Y$-$J$s$G$9$+$M$(!#e(B
| > rubye$BK\BNB&$b$G$9$,!#e(B
|
| e$B?tG/A0$+$i$N7|0F$G$9$M$'!"M_$7$$$H;W$$$^$9!#e(B

e$B8_49@-$N$3$H$r9M$($k$H$"$s$^$j4JC1$KJQ99$O$G$-$J$$$s$G$9$1$Ie(B
e$B$M!#e(B
e$B%a%=%C%I$rJ,$1$k$+!"7k2L$Ne(Bencodinge$B$r2?$i$+$N7A$G;XDj$G$-$k$he(B
e$B$&$K$9$k$+$7$J$$$H$$$1$J$$$H$O;W$&$s$G$9$,!#e(B

| e$B$H$3$m$G!"e(BUTF-16LE e$B$G$J$/!“e(Bpack e$B$”$?$j$K$D$C$3$s$Ge(B UTF-8 e$B$NJ}$,;H$$$d$9e(B
| e$B$+$C$F$j$7$^$;$s$+!#e(B

e$B8D?ME*$K$O!“$I$C$A$G$bF1$8DxEY$K$O;H$($J$$e(B :slight_smile: e$B$H;W$&$N$G!”$Ie(B
e$B$C$A$G$b$$$$$s$G$9$,!"e(BUTF-8e$B$NJ}$,$h$C$]$IM-Mx$H$+$8$c$J$1$l$P!"e(B
APIe$B$,JV$7$?7A$r$=$N$^$^$NJ}$,<BAu$9$kJ}$O3Z$J$N$G$=$C$A$+$J!"e(B
e$B$H;W$$$^$9!#e(B

e$B$H$$$&$o$1$G!V$h$C$]$IM-Mx!W$NNc$OJg=8!#e(B

e$B$=$l$G$O!#e(B

U.Nakamura wrote:

e$B8_49@-$N$3$H$r9M$($k$H$"$s$^$j4JC1$KJQ99$O$G$-$J$$$s$G$9$1$Ie(B
e$B$M!#e(B
e$B%a%=%C%I$rJ,$1$k$+!"7k2L$Ne(Bencodinge$B$r2?$i$+$N7A$G;XDj$G$-$k$he(B
e$B$&$K$9$k$+$7$J$$$H$$$1$J$$$H$O;W$&$s$G$9$,!#e(B

e$B%$%s%9%?%s%9$r:n$k;~$K%G%U%)%k%H$r;XDj$7$F?6$jJ,$1$H$+$J$N$G$9$+$M!#e(B
default_external e$B$,e(B ASCII-8BIT e$B$J$ie(B multi byte
e$B$G!"$=$l0J30$Oe(B UTF-8 e$B$H$+e(B
e$B$@$HHyL/$+$J$!!#e(B

| e$B$H$3$m$G!"e(BUTF-16LE e$B$G$J$/!“e(Bpack e$B$”$?$j$K$D$C$3$s$Ge(B UTF-8 e$B$NJ}$,;H$$$d$9e(B
| e$B$+$C$F$j$7$^$;$s$+!#e(B

e$B8D?ME*$K$O!"$I$C$A$G$bF1$8DxEY$K$O;H$($J$$e(B :slight_smile: e$B$H;W$&$N$G!"$Ie(B
e$B$C$A$G$b$$$$$s$G$9$,!"e(BUTF-8e$B$NJ}$,$h$C$]$IM-Mx$H$+$8$c$J$1$l$P!"e(B
APIe$B$,JV$7$?7A$r$=$N$^$^$NJ}$,<BAu$9$kJ}$O3Z$J$N$G$=$C$A$+$J!"e(B
e$B$H;W$$$^$9!#e(B

e$B$H$$$&$o$1$G!V$h$C$]$IM-Mx!W$NNc$OJg=8!#e(B

e$B$(!<!"$=$&$G$9$+!<!#e(B
lead-byte e$B$He(B trail-byte
e$B$,0c$&$"$?$j!":G9b$@$H;W$&$s$G$9$1$l$I!#e(B
2e$B%P%$%HL$,2u$l$F$ke(B SJIS e$B$O$b$H$h$j!"e(BEUC
e$B$@$C$F$a$8$c$J$$$G$9$h!*e(B
e$B$R$i%+%?4A;ze(B 3 byte e$B$G$9$1$I!*e(B

e$B$=$l$O$5$F$*$-!"e(B

  • UTF-8 e$B$O%S%k%H%$%s%(%s%3!<%G%#%s%0$@$,!"e(BUTF-16LE e$B$O0c$&e(B

  • UTF-8 e$B$Oe(B ascii compatible e$B$@$,e(B UTF-16LE e$B$O0c$&e(B
    e$B$N!">eFs$D$@$1$G$b!V$h$C$]$IM-Mx!W$8$c$J$$$+$J$H;W$$$^$9!#e(B

  • UTF-8 e$B$He(B UTF-16LE e$B$O>pJs$r<:$&$3$H$J$/!"7W;;$GJQ492DG=e(B
    e$B$G$9$7$M!#e(B

e$B<BAu$NJ}$O$H$j$"$($:e(B ole_utf82wc e$B$He(B ole_wc2utf8
e$B$rMQ0U$9$l$P$$$$$s$G$7$ge(B
e$B$&$+!#e(B
e$BB>$K1F6AHO0O$"$j$=$&$J5$$b$7$^$9$,$H$j$"$($:MQ0U$7$H$-$^$9!#e(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:33439] Re: Win32OLE: set encoding to OLE string”
on Jan.28,2008 12:21:23, [email protected] wrote:
| > e$B8_49@-$N$3$H$r9M$($k$H$"$s$^$j4JC1$KJQ99$O$G$-$J$$$s$G$9$1$Ie(B
| > e$B$M!#e(B
| > e$B%a%=%C%I$rJ,$1$k$+!“7k2L$Ne(Bencodinge$B$r2?$i$+$N7A$G;XDj$G$-$k$he(B
| > e$B$&$K$9$k$+$7$J$$$H$$$1$J$$$H$O;W$&$s$G$9$,!#e(B
|
| e$B%$%s%9%?%s%9$r:n$k;~$K%G%U%)%k%H$r;XDj$7$F?6$jJ,$1$H$+$J$N$G$9$+$M!#e(B
| default_external e$B$,e(B ASCII-8BIT e$B$J$ie(B multi byte e$B$G!”$=$l0J30$Oe(B UTF-8 e$B$H$+e(B
| e$B$@$HHyL/$+$J$!!#e(B

default_externale$B$=$N$b$N$K$J$k$J$i$$$$$H;W$&$s$G$9$,!“e(B
default_externale$B$,e(BWindows-31Je$B$J$N$K7k2L$,>!<j$Ke(BUTF-8e$B$K$J$C$Fe(B
e$B$?$i!”;d$@$C$?$iJrA3$H$7$^$9!#e(B
e$B$D!<$+$=$le(B1.8e$B$H$^$C$?$/8_49@-$J$$$8$c$J$$$G$9$+!<!#e(B

| > e$B8D?ME*$K$O!“$I$C$A$G$bF1$8DxEY$K$O;H$($J$$e(B :slight_smile: e$B$H;W$&$N$G!”$Ie(B
| > e$B$C$A$G$b$$$$$s$G$9$,!“e(BUTF-8e$B$NJ}$,$h$C$]$IM-Mx$H$+$8$c$J$1$l$P!“e(B
| > APIe$B$,JV$7$?7A$r$=$N$^$^$NJ}$,<BAu$9$kJ}$O3Z$J$N$G$=$C$A$+$J!“e(B
| > e$B$H;W$$$^$9!#e(B
| > # e$B$H$$$&$o$1$G!V$h$C$]$IM-Mx!W$NNc$OJg=8!#e(B
|
| e$B$(!<!”$=$&$G$9$+!<!#e(B
| lead-byte e$B$He(B trail-byte e$B$,0c$&$”$?$j!”:G9b$@$H;W$&$s$G$9$1$l$I!#e(B
| 2e$B%P%$%HL$,2u$l$F$ke(B SJIS e$B$O$b$H$h$j!"e(BEUC e$B$@$C$F$a$8$c$J$$$G$9$h!*e(B
| e$B$R$i%+%?4A;ze(B 3 byte e$B$G$9$1$I!*e(B

e$B$^$“!”$=$l$i$OA4$Fe(BRubye$B$G07$&J,$K$O5$$K$J$i$J$$$O$:$J$N$Ge(B :slight_smile:

| * UTF-8 e$B$O%S%k%H%$%s%(%s%3!<%G%#%s%0$@$,!"e(BUTF-16LE e$B$O0c$&e(B

locale charmape$B$b$=$&$8$c$J$$$N$G$“$s$^$j5$$K$J$j$^$;$s!#e(B
Shift_JISe$B$de(BEUC-JPe$B$,%S%k%H%$%s$8$c$J$/$J$C$?$N$O!”$=$&$$$&$3$He(B
e$B$r5$$K$7$?J}$,Ii$1!"$H$$$&F;$re(Brubye$B$OA*Br$7$?$H$$$&$3$H$8$c$Je(B
e$B$$$+$H;W$$$^$9!#e(B

e$B$H$$$&$+!“I,MW$G$”$l$Pe(BWindowse$B$G$Oe(BUTF-16LEe$B$r%S%k%H%$%s$K$9$k$He(B
e$B$$$&A*Br$b$"$j$($^$9e(B(e$B$7$J$$$H;W$&$1$Ie(B)e$B!#e(B

| * UTF-8 e$B$Oe(B ascii compatible e$B$@$,e(B UTF-16LE e$B$O0c$&e(B
|
| * UTF-8 e$B$He(B UTF-16LE e$B$O>pJs$r<:$&$3$H$J$/!"7W;;$GJQ492DG=e(B
| e$B$G$9$7$M!#e(B

e$B$3$Ne(B2e$BE@$O!“e(BUTF-8e$B$rA*$V$KB-$kM}M3$G$”$k$H$O;W$$$^$9!#e(B

e$B;d$N$[$&$+$ie(BUTF-16LEe$B$r?d$9%a%j%C%H$b5s$2$F$*$-$^$7$g$&$+!#e(B

  • UTF-16LEe$B$r<u$1IU$1$ke(BWin32
    APIe$B$O;3$[$I$"$k$,!"e(BUTF-8e$B$r<u$1IUe(B
    e$B$1$ke(BAPIe$B$O;ve$J$$!#e(B

  • UTF-16LE → UTF-8 e$B$O7W;;$GJQ492DG=$H$O$$$(!"Kh2sI,$:$3$NJQe(B
    e$B49$,I,MW$K$J$k!#e(B

  • OSe$B$+$i<hF@$7$?J8;zNs$r<+F0E*$Ke(Bencodinge$BJQ49$9$k=hM}$O8=:_$Ne(B
    rubye$B$K$O$J$$$N$G0[<A$G$“$k!#e(B(e$B$”!"e(BTimezonee$B$G$J$s$+F~$C$?$C$1e(B?)

e$B$=$l$G$O!#e(B

e$B=uED$G$9!#e(B

e$B$A$g$C$H$3$N$H$3$mBND4$,0-$/$F!"5$$K$J$C$F$$$k$b$N$Ne(B
encodinge$BMm$_$NBP1~$,$G$-$F$J$/$F$9$$$^$;$s$G$9!#e(B

U.Nakamura wrote:

Win32OLEe$B$G!"e(BOLEe$B7PM3$G<hF@$7$?J8;zNs$Ke(Bencodinge$B$r@Dj$9$k%Q%C%Ae(B
e$B$r:n$C$F$
$^$7$?!#e(B

e$B;d$O!"$^$@!"e(BRuby e$B$N%(%s%3!<%G%#%s%0$r$h$/M}2r$7$F$$$^$;$s!#e(B
e$B$=$3$GAGKQ$J<ALd$J$s$G$9$,!"e(B
rb_default_external() e$B$8$c$J$/$F!"e(Brb_locale_encoding()
e$B$NJ}$,E,@Z$J$s$G$7$g$&$+!)e(B

e$B$"$H!"e(BWIN32OLE.codepage=
e$B$G!"e(BCP_ACPe$B0J30$N%3!<%I%Z!<%8$re(B
e$B;XDj$5$l$F$$$?>l9g!"L5>r7o$K!"e(Brb_locale_encoding()e$B$9$k$N$Oe(B
e$B$^$:$/$J$$$s$G$7$g$&$+!)e(B

e$B<+J,$G$be(BWin32OLEe$B$Ne(Bencodinge$BMm$_$N;EMM$O$I$&$9$k$N$,$$$$$N$+!"e(B
e$B@0M}$G$-$F$$$J$$>uBV$G$9!#e(B

e$B=uEDe(B e$B2m5*e(B

e$B@.@%$G$9!"$b$&$G$-$?!#e(B

NARUSE, Yui wrote:

e$B<BAu$NJ}$O$H$j$"$($:e(B ole_utf82wc e$B$He(B ole_wc2utf8 e$B$rMQ0U$9$l$P$$$$$s$G$7$ge(B
e$B$&$+!#e(B
e$BB>$K1F6AHO0O$"$j$=$&$J5$$b$7$^$9$,$H$j$"$($:MQ0U$7$H$-$^$9!#e(B

ndex: ext/win32ole/win32ole.c

— ext/win32ole/win32ole.c (revision 15284)
+++ ext/win32ole/win32ole.c (working copy)
@@ -784,6 +784,24 @@ ole_wc2mb(LPWSTR pw)
return pm;
}

+static char *
+ole_wc2utf8(LPWSTR pw)
+{

  • int size;
  • LPSTR pm;
  • size = WideCharToMultiByte(CP_UTF8, 0, pw, -1, NULL, 0, NULL,
    NULL);
  • if (size) {
  •    pm = ALLOC_N(char, size + 1);
    
  •    WideCharToMultiByte(CP_UTF8, 0, pw, -1, pm, size, NULL, NULL);
    
  •    pm[size] = '\0';
    
  • }
  • else {
  •    pm = ALLOC_N(char, 1);
    
  •    *pm = '\0';
    
  • }
  • return pm;
    +}

static VALUE
ole_hresult2msg(HRESULT hr)
{
@@ -963,6 +981,17 @@ ole_mb2wc(char *pm, int len)
return pw;
}

+static LPWSTR
+ole_utf82wc(char *pm, int len)
+{

  • int size;
  • LPWSTR pw;
  • size = MultiByteToWideChar(CP_UTF8, 0, pm, len, NULL, 0);
  • pw = SysAllocStringLen(NULL, size - 1);
  • MultiByteToWideChar(CP_UTF8, 0, pm, len, pw, size);
  • return pw;
    +}

static VALUE
ole_wc2vstr(LPWSTR pw, BOOL isfree)
{

e$B<jH4$-$C$F8@$o$J$$$G#w#w#w#we(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:33444] Re: Win32OLE: set encoding to OLE string”
on Jan.28,2008 15:27:15, [email protected] wrote:
| e$B$A$g$C$H$3$N$H$3$mBND4$,0-$/$F!"5$$K$J$C$F$$$k$b$N$Ne(B
| encodinge$BMm$_$NBP1~$,$G$-$F$J$/$F$9$$$^$;$s$G$9!#e(B

e$B$“$j$c!”$=$l$O$*Bg;v$K$7$F$/$@$5$$!#e(B

| U.Nakamura wrote:
| > Win32OLEe$B$G!“e(BOLEe$B7PM3$G<hF@$7$?J8;zNs$Ke(Bencodinge$B$r@Dj$9$k%Q%C%Ae(B
| > e$B$r:n$C$F$
$^$7$?!#e(B
|
| e$B;d$O!”$^$@!"e(BRuby e$B$N%(%s%3!<%G%#%s%0$r$h$/M}2r$7$F$$$^$;$s!#e(B
| e$B$=$3$GAGKQ$J<ALd$J$s$G$9$,!"e(B
| rb_default_external() e$B$8$c$J$/$F!"e(Brb_locale_encoding()
| e$B$NJ}$,E,@Z$J$s$G$7$g$&$+!)e(B

Win32 APIe$B$+$i$H$C$F$-$?J8;zNs$OEvA38=:_$N%3!<%I%Z!<%8$G$“$C$Fe(B
default_externale$B$G$”$k$H$O8B$j$^$;$s$+$i!"e(Brb_locale_encoding()
e$B$NJ}$,E,@Z$@$HH=CG$7$^$7$?!#e(B

| e$B$"$H!"e(BWIN32OLE.codepage= e$B$G!"e(BCP_ACPe$B0J30$N%3!<%I%Z!<%8$re(B
| e$B;XDj$5$l$F$$$?>l9g!"L5>r7o$K!"e(Brb_locale_encoding()e$B$9$k$N$Oe(B
| e$B$^$:$/$J$$$s$G$7$g$&$+!)e(B

… e$B$,!"%3!<%I%Z!<%8$,;XDj2DG=$H$O5$$E$$$F$J$+$C$?$G$9!#e(B
e$B$H$$$&$3$H$O!“e(Brb_locale_charmap()e$BAjEv$N=hM}$r$+$^$9I,MW$,$”$ke(B
e$B$G$7$g$&$M!#e(B
e$B$^$$$C$?$J!#e(B

| e$B<+J,$G$be(BWin32OLEe$B$Ne(Bencodinge$BMm$_$N;EMM$O$I$&$9$k$N$,$$$$$N$+!"e(B
| e$B@0M}$G$-$F$$$J$$>uBV$G$9!#e(B

e$BM}A[$O!“e(BCP_ACP(OEMCPe$B$+$Je(B)e$B$KJQ49$7$J$$$G!”<h$C$F$-$?$^$^$Ne(BUTF-16LE
e$B$“$k$$$O@.@%$5$s$N8@$&$h$&$Ke(BUTF-8e$B$GJV$9$3$H$@$H;W$$$^$9!#e(B
e$B$,!“8=<BLdBj$H$7$F8_49@-$r0];}$9$kI,MW$O$=$l$J$j$K$”$k$H;W$$e(B
e$B$^$9$N$G!”$H$j$"$($:$Oe(B cWIN32OLE_cp
e$B$re(Brubye$B$Ne(BEncodinge$B$K%^%C%We(B
e$B$7$?7A$G@_Dj$9$k$N$,$h$$$N$G$O$J$$$+$H;W$$$^$9!#e(B

e$B$^$"!“0J>e$O$”$/$^$G;d$+$i$NDs0F$G$9$N$G!"ET9g$N$$$$$h$&$K$7e(B
e$B$F$/$@$5$$!#e(B

rubye$BK\BNB&$O!“%G%U%)%k%H$G$Oe(BWe$B7Oe(BAPIe$B$r;H$C$?>e$Ge(Brb_locale_encoding()
e$B$KJQ49$9$kJ}8~$K9T$3$&$+$J$”$H$O9M$($F$$$^$9!#e(B
UTF-8e$B$J$je(BUTF-16LEe$B$J$j$GJV$9J}K!$O$^$?JLES9M$($k$D$b$j!#e(B

e$B$=$l$G$O!#e(B

U.Nakamura wrote:

e$B$NJ}$,E,@Z$@$HH=CG$7$^$7$?!#e(B
e$B$J$k$[$I!#e(B

| e$B$"$H!"e(BWIN32OLE.codepage= e$B$G!"e(BCP_ACPe$B0J30$N%3!<%I%Z!<%8$re(B
| e$B;XDj$5$l$F$$$?>l9g!"L5>r7o$K!"e(Brb_locale_encoding()e$B$9$k$N$Oe(B
| e$B$^$:$/$J$$$s$G$7$g$&$+!)e(B

… e$B$,!"%3!<%I%Z!<%8$,;XDj2DG=$H$O5$$E$$$F$J$+$C$?$G$9!#e(B

e$B0JA0!"e(B-Ke$B%*%W%7%g%s$K9g$o$;$F!“e(BWin32OLEe$BB&$N%3!<%I%Z!<%8$rJQ99$7$Fe(B
e$B$/$le(B(-Kue$B$N$H$-$Ke(BUTF-8e$B$K$7$F$/$le(B)e$B$H$$$&MWK>$,$”$j$^$7$?!#e(B

e$BEv;~$+$i!"e(BRuby e$BK\BNB&$G!"e(Bm17ne$B2=$NMm$_$G!"e(B-K
e$B%%W%7%g%s$OL5$/$9e(B
e$BJ}8~$H$$$&OC$,=P$F$$$?$N$G!"e(B-Ke$B%
%W%7%g%s$O4:$($FL5;k$7$F!"e(B
e$B%3!<%I%Z!<%8$r;XDj$G$-$k$h$&$K$7$^$7$?!#e(B

e$BM}A[$O!“e(BCP_ACP(OEMCPe$B$+$Je(B)e$B$KJQ49$7$J$$$G!”<h$C$F$-$?$^$^$Ne(BUTF-16LE
e$B$"$k$$$O@.@%$5$s$N8@$&$h$&$Ke(BUTF-8e$B$GJV$9$3$H$@$H;W$$$^$9!#e(B
e$B$,!“8=<BLdBj$H$7$F8_49@-$r0];}$9$kI,MW$O$=$l$J$j$K$”$k$H;W$$e(B
e$B$^$9$N$G!"$H$j$"$($:$Oe(B cWIN32OLE_cp e$B$re(Brubye$B$Ne(BEncodinge$B$K%^%C%We(B
e$B$7$?7A$G@_Dj$9$k$N$,$h$$$N$G$O$J$$$+$H;W$$$^$9!#e(B

e$BC1$J$k3NG’$J$N$G$9$,!"e(Bruby e$B$Ne(B Encoding e$B$H$$$&$N$O!"e(B
Encoding.default_external(rb_default_external()) e$B$N$3$He(B
e$B$H$$$&M}2r$G9g$C$F$^$9$+!)e(B

e$B$"$H!"e(BcWIN32OLE_cp (Windowse$B$N%3!<%I%Z!<%8e(B) e$B$He(B ruby
e$B$Ne(B Encoding
e$B$rBP1~$E$1$k$h$&$JET9g$N$$$$e(BAPIe$B$O!"e(BRubye$B$K$OMQ0U$5$l$F$$$J$$e(B
e$B$G$9$h$M!)e(B

e$B=uEDe(B e$B2m5*e(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:33450] Re: Win32OLE: set encoding to OLE string”
on Jan.28,2008 16:55:27, [email protected] wrote:
| e$B0JA0!"e(B-Ke$B%%W%7%g%s$K9g$o$;$F!“e(BWin32OLEe$BB&$N%3!<%I%Z!<%8$rJQ99$7$Fe(B
| e$B$/$le(B(-Kue$B$N$H$-$Ke(BUTF-8e$B$K$7$F$/$le(B)e$B$H$$$&MWK>$,$”$j$^$7$?!#e(B
|
| e$BEv;~$+$i!"e(BRuby e$BK\BNB&$G!"e(Bm17ne$B2=$NMm$_$G!"e(B-K e$B%
%W%7%g%s$OL5$/$9e(B
| e$BJ}8~$H$$$&OC$,=P$F$$$?$N$G!"e(B-Ke$B%*%W%7%g%s$O4:$($FL5;k$7$F!"e(B
| e$B%3!<%I%Z!<%8$r;XDj$G$-$k$h$&$K$7$^$7$?!#e(B

e$B$J$k$[$I!<!#e(B
e$B$3$NJU$O>-Mh@-$r8+1[$7$?@_7W$@$C$?$s$G$9$M!#e(B

| > e$BM}A[$O!“e(BCP_ACP(OEMCPe$B$+$Je(B)e$B$KJQ49$7$J$$$G!”<h$C$F$-$?$^$^$Ne(BUTF-16LE
| > e$B$“$k$$$O@.@%$5$s$N8@$&$h$&$Ke(BUTF-8e$B$GJV$9$3$H$@$H;W$$$^$9!#e(B
| > e$B$,!“8=<BLdBj$H$7$F8_49@-$r0];}$9$kI,MW$O$=$l$J$j$K$”$k$H;W$$e(B
| > e$B$^$9$N$G!”$H$j$"$($:$Oe(B cWIN32OLE_cp e$B$re(Brubye$B$Ne(BEncodinge$B$K%^%C%We(B
| > e$B$7$?7A$G@_Dj$9$k$N$,$h$$$N$G$O$J$$$+$H;W$$$^$9!#e(B
|
| e$BC1$J$k3NG’$J$N$G$9$,!"e(Bruby e$B$Ne(B Encoding e$B$H$$$&$N$O!"e(B
| Encoding.default_external(rb_default_external()) e$B$N$3$He(B
| e$B$H$$$&M}2r$G9g$C$F$^$9$+!)e(B

e$B$“!”$=$&$8$c$J$/$F!"e(BWindowse$B$N%3!<%I%Z!<%8e(B(932e$B$H$+e(B10001e$B$H$+e(B)e$B$Ke(B
e$BBP1~$7$?e(Brb_encoding *e$B$H$$$&0UL#$G$7$?!#e(B

| e$B$"$H!"e(BcWIN32OLE_cp (Windowse$B$N%3!<%I%Z!<%8e(B) e$B$He(B ruby e$B$Ne(B Encoding
| e$B$rBP1~$E$1$k$h$&$JET9g$N$$$$e(BAPIe$B$O!"e(BRubye$B$K$OMQ0U$5$l$F$$$J$$e(B
| e$B$G$9$h$M!)e(B

e$B$J$$$G$9!“$,!”:n$C$F$_$h$&$+$H9M$($?$j$7$FLe!9$H$7$F$^$9!#e(B

e$B$=$l$G$O!#e(B

e$B=uED$G$9!#e(B

U.Nakamura wrote:

| e$B$^$$$C$?$J!#e(B

e$B$7$F$_$^$7$?!#e(B

e$B$"$j$,$H$&$4$6$$$^$9!#e(B
e$B$H$j$"$($:!"%3%_%C%H$7$F$$$?$@$1$^$9$+!)e(B

e$B$"$H!";d$,5$$K$J$C$F$$$k$N$O!"e(B
(1) ruby e$B$Ne(B -E e$B%%W%7%g%s$K1~$8$F!"e(BcWIN32OLE_cp
e$B$N=i4|CM$re(B
e$BJQ99$7$?J}$,$$$$$+$I$&$+!#e(B
(Windows-31Je$B$,;XDj$5$l$?$i!"e(B932e$B$r@_Dj$7$F$
$/$H$+!#e(B)
(2) ruby e$B$NJ8;zNs$re(BOLEe$BB&$KEO$9$H$-$K$O!"e(BcWIN32OLE_cpe$B$Ne(B
e$BCM$OL5;k$7$F!"Kh2se(BStringe$B$Ne(Bencodinge$B$+$ie(BUTF-16LEe$B$KJQ49e(B
e$B$7$?J}$,$$$$$+$I$&$+!#e(B
e$B$0$i$$$G$9!#e(B

(1) e$B$O!"e(BInit_win32olee$BFb$Ge(B1e$B2s$d$l$P:Q$`$s$G$7$g$&$1$I!"e(B
(2) e$B$O!"Kh2se(Bencodinge$B$r8+$?>l9g$N%Q%U%)!<%^%s%9$,$A$g$C$H5$$Ke(B
e$B$J$C$F$^$9!#e(B

e$B=uEDe(B e$B2m5*e(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:33458] Re: Win32OLE: set encoding to OLE string”
on Jan.28,2008 18:53:43, [email protected] wrote:
| e$B$H$j$“$($:!”%3%_%C%H$7$F$$$?$@$1$^$9$+!)e(B

e$B$7$^$7$?!#e(B

| e$B$“$H!”;d$,5$$K$J$C$F$$$k$N$O!"e(B
| (1) ruby e$B$Ne(B -E e$B%%W%7%g%s$K1~$8$F!"e(BcWIN32OLE_cp e$B$N=i4|CM$re(B
| e$BJQ99$7$?J}$,$$$$$+$I$&$+!#e(B
| (Windows-31Je$B$,;XDj$5$l$?$i!"e(B932e$B$r@_Dj$7$F$
$/$H$+!#e(B)

e$B$3$l$O!“e(B[ruby-dev:33450]e$B$N$*OC$rJ9$/8B$j$O!”$=$&$$$&J}8~$,$$e(B
e$B$$$s$8$c$J$$$+$H$$$&5$$O$7$^$9!#e(B
e$B$7$+$7e(Bencodinge$B$+$ie(Bcodepagee$B0z$CD%$k$N$O$I$&$7$?$b$s$+$7$i!#e(B

| (2) ruby e$B$NJ8;zNs$re(BOLEe$BB&$KEO$9$H$-$K$O!"e(BcWIN32OLE_cpe$B$Ne(B
| e$BCM$OL5;k$7$F!"Kh2se(BStringe$B$Ne(Bencodinge$B$+$ie(BUTF-16LEe$B$KJQ49e(B
| e$B$7$?J}$,$$$$$+$I$&$+!#e(B
| e$B$0$i$$$G$9!#e(B
(snip)
| (2) e$B$O!"Kh2se(Bencodinge$B$r8+$?>l9g$N%Q%U%)!<%^%s%9$,$A$g$C$H5$$Ke(B
| e$B$J$C$F$^$9!#e(B

e$B$&!<$s!“JQ49$7$?J}$,$$$$$+$I$&$+!”$@$C$?$i!“$7$?J}$,$$$$$s$@e(B
e$B$m$&$H$O;W$&$N$G$9$,!”%Q%U%)!<%^%s%9$Oe(B…
encoding → codepagee$B$NJQ49I=$r%O%C%7%e$G;}$C$F%-%c%C%7%e$9$ke(B
e$B$H$+$K$J$k$s$G$7$g$&$+$M!#e(B

e$B$=$l$G$O!#e(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:33446] Re: Win32OLE: set encoding to OLE string”
on Jan.28,2008 15:44:11, [email protected] wrote:
| | e$B$"$H!"e(BWIN32OLE.codepage= e$B$G!"e(BCP_ACPe$B0J30$N%3!<%I%Z!<%8$re(B
| | e$B;XDj$5$l$F$$$?>l9g!"L5>r7o$K!“e(Brb_locale_encoding()e$B$9$k$N$Oe(B
| | e$B$^$:$/$J$$$s$G$7$g$&$+!)e(B
|
| … e$B$,!”%3!<%I%Z!<%8$,;XDj2DG=$H$O5$$E$$$F$J$+$C$?$G$9!#e(B
| e$B$H$$$&$3$H$O!“e(Brb_locale_charmap()e$BAjEv$N=hM}$r$+$^$9I,MW$,$”$ke(B
| e$B$G$7$g$&$M!#e(B
| e$B$^$$$C$?$J!#e(B

e$B$7$F$_$^$7$?!#e(B

ACPe$B!“e(BOEMCPe$B!“e(BMACCPe$B$OESCf$GJQ$o$k$o$1$O$”$k$^$$$H$$$&$3$H$r4|BTe(B
e$B$7$F$^$9!#e(B
THREAD_ACPe$B$O!“L>A0$+$i$9$k$HJQ$o$j$=$&$J5$$,$7$^$9$,!”$H$j$“e(B
e$B$($:JQ$o$i$J$$$H?.$8$k$3$H$K$7$^$7$?!#e(B
rubye$B$,CN$i$J$$e(Bcodepagee$B$,Mh$?$ie(Bdummy
encodinge$B$,EPO?$5$l$k$h$&e(B
e$B$K$J$C$F$$$^$9$,!”$^$”<B:]$K;HMQ$5$l$ke(Bencodinge$B$O$[$H$s$ICN$Ce(B
e$B$F$k$O$:$J$N$G$3$s$J$b$s$G!#e(B

CP_UTF7e$B$He(BCP_UTF8e$B$O!"<B$O:#$Oe(Brubye$B$OCN$i$J$$$s$G$9$,!"8e$GDIe(B

e$B2C$7$F$*$-$^$9!#e(B

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);
    }

e$B$=$l$G$O!#e(B

e$B=uED$G$9!#e(B

NARUSE, Yui wrote:

e$B<+F0JQ49$O%"%l%k%.!<$,=P$k$N$G$9$,$=$l$O$5$F$*$-!"e(B

Win32OLEe$BFb$GJQ49$9$k$s$8$c$J$/$F!"e(BWin32OLEe$B$KEO$9e(Brubye$B$Ne(BStringe$B$Ne(B
encodinge$B$Oe(BUTF-16LEe$B$rA0Ds$H$9$kJ}$,$h$$$H$$$&$3$H$G$7$g$&$+!)e(B

e$B:#$^$G$Ne(B ANSI e$B$GEO$7$F$$$k;~$G$bKh2sN"$Ge(B Windows e$B$,JQ49$7$F$$$k$s$G$9$+e(B
e$B$i!"$=$3$^$G5$$K$7$J$/$F$b$$$$$h$&$K$b!#e(B

e$B$(!<$H!"e(BStringe$B$Ne(Bencodinge$B$r8+$k>l9g$K$O!"e(B
1.
Stringe$B$Ne(Bencodinge$B$N>pJs$r85$Ke(BWindowse$B$N%3!<%I%Z!<%8$r5a$a$k!#e(B
2. UTF-16LEe$B$KJQ49$9$k!#e(B
e$B$Ne(B2e$BCJ3,$K$J$C$F!"e(B1.e$B$N=hM}$,A}$($k$N$,5$$K$J$C$?$@$1$G$9!#e(B

e$B:#$^$G$@$H!"I,MW$K1~$8$F!"e(BWIN32OLE.codepage=
e$B%a%=%C%I$r;H$C$Fe(B
e$B;vA0$Ke(BWin32OLEe$B$r;H$&B&$,;XDj$9$k$H$$$&J}?K$@$C$?$N$G!“e(B1.e$B$N=hM}$Oe(B
e$B$”$j$^$;$s$G$7$?!#e(B

e$BFH<+$K%O%C%7%e$G;}$DDxEY$J$i5$$K$7$J$/$F$b$$$$$N$+!#e(B

e$B=uEDe(B e$B2m5*e(B

e$B@.@%$G$9!#e(B

Masaki S. wrote:

| e$B$J$C$F$^$9!#e(B

e$B$&!<$s!“JQ49$7$?J}$,$$$$$+$I$&$+!”$@$C$?$i!"$7$?J}$,$$$$$s$@e(B
e$B$m$&$H$O;W$&$N$G$9$,!"%Q%U%)!<%^%s%9$Oe(B…
e$B<+F0JQ49$O%"%l%k%.!<$,=P$k$N$G$9$,$=$l$O$5$F$*$-!"e(B

Win32OLEe$BFb$GJQ49$9$k$s$8$c$J$/$F!"e(BWin32OLEe$B$KEO$9e(Brubye$B$Ne(BStringe$B$Ne(B
encodinge$B$Oe(BUTF-16LEe$B$rA0Ds$H$9$kJ}$,$h$$$H$$$&$3$H$G$7$g$&$+!)e(B

e$B$N!“J}$,$$$$$H$O;W$&$N$G$9$,!”$^$!ITJX$G$9$+$i$h$7$J$K$7$F$/$l$?J}$,$$$$e(B
e$B$N$G$7$g$&$M$’!#e(B

e$B$"$j$^$;$s$G$7$?!#e(B

e$BFH<+$K%O%C%7%e$G;}$DDxEY$J$i5$$K$7$J$/$F$b$$$$$N$+!#e(B

2e$B$G?tJ8;zJQ49$9$l$PKd$b$l$F$7$^$&DxEY$N=hM}$@$H;W$$$^$9!#e(B

e$B@.@%$G$9!#e(B

U.Nakamura wrote:

| e$B$"$H!";d$,5$$K$J$C$F$$$k$N$O!"e(B
| (1) ruby e$B$Ne(B -E e$B%%W%7%g%s$K1~$8$F!"e(BcWIN32OLE_cp e$B$N=i4|CM$re(B
| e$BJQ99$7$?J}$,$$$$$+$I$&$+!#e(B
| (Windows-31Je$B$,;XDj$5$l$?$i!"e(B932e$B$r@_Dj$7$F$
$/$H$+!#e(B)

e$B$3$l$O!“e(B[ruby-dev:33450]e$B$N$*OC$rJ9$/8B$j$O!”$=$&$$$&J}8~$,$$e(B
e$B$$$s$8$c$J$$$+$H$$$&5$$O$7$^$9!#e(B
e$B$7$+$7e(Bencodinge$B$+$ie(Bcodepagee$B0z$CD%$k$N$O$I$&$7$?$b$s$+$7$i!#e(B

Ruby
e$BK\BN$N%F!<%V%k$GLVMe$9$k$N$bHyL/$+$D<BAu$,J#;($=$&$J$N$G!"JL$K%O%Ce(B
e$B%7%e%F!<%V%k$r;}$D$3$H$K$J$k$N$G$9$+$M$’!#e(B

| (2) ruby e$B$NJ8;zNs$re(BOLEe$BB&$KEO$9$H$-$K$O!"e(BcWIN32OLE_cpe$B$Ne(B
| e$BCM$OL5;k$7$F!"Kh2se(BStringe$B$Ne(Bencodinge$B$+$ie(BUTF-16LEe$B$KJQ49e(B
| e$B$7$?J}$,$$$$$+$I$&$+!#e(B
| e$B$0$i$$$G$9!#e(B
(snip)
| (2) e$B$O!"Kh2se(Bencodinge$B$r8+$?>l9g$N%Q%U%)!<%^%s%9$,$A$g$C$H5$$Ke(B
| e$B$J$C$F$^$9!#e(B

e$B$&!<$s!“JQ49$7$?J}$,$$$$$+$I$&$+!”$@$C$?$i!"$7$?J}$,$$$$$s$@e(B
e$B$m$&$H$O;W$&$N$G$9$,!"%Q%U%)!<%^%s%9$Oe(B…

e$B<+F0JQ49$O%"%l%k%.!<$,=P$k$N$G$9$,$=$l$O$5$F$*$-!"e(B

e$B:#$^$G$Ne(B ANSI e$B$GEO$7$F$$$k;~$G$bKh2sN"$Ge(B Windows
e$B$,JQ49$7$F$$$k$s$G$9$+e(B
e$B$i!"$=$3$^$G5$$K$7$J$/$F$b$$$$$h$&$K$b!#e(B