# Requests to transcode

**URL:** <https://www.ruby-forum.com/t/requests-to-transcode/126672>\
**Category:** Development\
**Created:** [January 21, 2008, 10:00am UTC](https://www.ruby-forum.com/t/requests-to-transcode/126672 "2008-01-21T10:00:00Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![U.Nakamura](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/b5ac83/32.png) [@U.Nakamura](https://www.ruby-forum.com/u/U.Nakamura)\
**Post date:** [January 21, 2008, 10:00am UTC](https://www.ruby-forum.com/t/requests-to-transcode/126672/1 "2008-01-21T10:00:00Z")

</div>

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

transcodee$B$K4X$7$F!“e(B3e$BE@$[$IMWK\>$,$”$k$N$G$9$,!"$=$l$\>$l\<B8=2De(B  
e$BG=@-e(B(e$B$H!"\<B8=$9$k$J$i;~4|e(B)e$B$O$I$s$J$b$s$G$7$g$&$+e(B?

(1) Windows-31Je$B%5%]!\<%He(B  
e$B3N$+0JA0$Ke(BMartine$B@h@8$,BP1~M=Dj$H$_$C$7$c$C$F$_$i$l$?$H;We(B  
e$B$$$^$9!#e(B  
e$BJL$K5^$+$9$o$1$8$c$J$$$G$9$,!"0l1~3NG’$H$$$&$3$H$G!#e(B

(2) e$BJQ49$G$-$J$$J8;z$N07$$e(B  
e$B8=\>u$OJQ49$G$-$J$$J8;z$,$"$k$HNc30$,H/@8$7$^$9$,!"$=$&$$e(B  
e$B$&J8;z$r!Ve(B?e$B!W$d!V".!W$J$I$KCV$-49$($F=hM}$rB39T$7$?$$\>lLLe(B  
e$B$b$=$l$J$j$K$"$k$H;W$$$^$9!#e(B  
[ruby-core:15036]e$B$"$?$j$+$i$NOC$,$=$&$@$H;W$$$^$9$,!"$3$le(B  
e$B$O$I$&$J$j$=$&$G$7$g$&$+e(B?

(3) C API  
String#encodee$B$KAjEv$9$ke(BC APIe$B$,M\_$7$$$G$9!#e(B  
e$B$^$"!"$=$N$^$^$J$ie(Bfuncalle$B$G$b$$$$$s$G$9$1$I!"$G$-$l$P$b$&e(B  
e$B$A$g$C$He(BCe$B4s$j$NE[$,M\_$7$$$G$9$M!#e(B

e$B$\*4j$$$P$C$+$j$K$J$C$A$c$C$F$^$9$,!"FbMF$K$h$C$F$O\<BAuLL$G$\*e(B  
e$B\<jEA$$$G$-$k$+$b$7$l$^$;$se(B(e$B$G$-$J$$$+$b$7$l$^$;$se(B)e$B!#e(B

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

---

<div class="post-metadata">

**Author:** ![U.Nakamura](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/b5ac83/32.png) [@U.Nakamura](https://www.ruby-forum.com/u/U.Nakamura)\
**Post date:** [January 21, 2008, 11:21am UTC](https://www.ruby-forum.com/t/requests-to-transcode/126672/2 "2008-01-21T11:21:44Z")

</div>

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

In message “[ruby-dev:33251] Re: requests to transcode”  
on Jan.21,2008 19:07:40, [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:  
| \>(1) Windows-31Je$B%5%]!\<%He(B  
| \> e$B3N$+0JA0$Ke(BMartine$B@h@8$,BP1~M=Dj$H$_$C$7$c$C$F$_$i$l$?$H;We(B  
| \> e$B$$$^$9!#e(B  
| \> e$BJL$K5^$+$9$o$1$8$c$J$$$G$9$,!“0l1~3NG’$H$$$&$3$H$G!#e(B  
|  
| e$B$3$A$i$G$O$b$&4{$K0l1~$d$C$?$s$G$9$,!”$=$N;~$K:#$Ne(B Shift\_JIS  
| e$B$He(B EUC-JP e$B$N$H$3$m$K$$$/$D$+$N5?Ld$,$G$F$-$F!"$3$l$r$-$A$s$He(B  
| e$B@v$$=P$7$FAjCL$7$h$&$H;W$C$F$$$^$9!#e(B

e$B$-$C$H@.@%$5$s$,$$$m$$$m=u$1$F$/$l$k$H;W$$$^$9!#e(B

# e$BB\>NOK\4j$G$9$\_$^$;$se(B

| \>(2) e$BJQ49$G$-$J$$J8;z$N07$$e(B  
| \> e$B8=\>u$OJQ49$G$-$J$$J8;z$,$“$k$HNc30$,H/@8$7$^$9$,!”$=$&$$e(B  
| \> e$B$&J8;z$r!Ve(B?e$B!W$d!V".!W$J$I$KCV$-49$($F=hM}$rB39T$7$?$$\>lLLe(B  
| \> e$B$b$=$l$J$j$K$“$k$H;W$$$^$9!#e(B  
| \> [ruby-core:15036]e$B$”$?$j$+$i$NOC$,$=$&$@$H;W$$$^$9$,!"$3$le(B  
| \> e$B$O$I$&$J$j$=$&$G$7$g$&$+e(B?  
|  
| e$B$=$&$G$9$M!#\<BAu$O$o$j$H4JC1$G$9$,!“e(BAPI e$B$r7h$a$J$$$H9T$1$J$$$G$9!#e(B  
| e$B:G=_E_$K%V%m%C%/$b$&$^$/;H$$$?$$$G$9$,!”$3$l$O$b$&\>/$7@h$@$H;W$$$^$9!#e(B  
| e$B8=:_9M$($F$$$k$N$ONc$($Pe(B File.fnmatch e$B$_$?$$$J%U%i%0$r;H$&$3$H$G$9!#e(B  
|  
| e$BNc$($Pe(B  
|  
| s.encode(‘EUC-JP’, String::ENCODE\_SUBSTITUTE\_TARGET\_DEFAULT)  
| e$B$H$+e(B  
| s.encode(‘Shift\_JIS’, ‘UTF-8’, String::DROP\_BROKEN\_BYTES)  
| e$B$H$+!#L^O@$b$&\>/$7C;$/$F$b$$$$$+$H;W$$$^$9e(B :-)e$B!#e(B

ruby-coree$B$K$"$C$?%V%m%C%/$r;H$&0F$O%9%^!\<%H$@$H$O;W$$$^$9!#e(B  
statefule$B$Je(Bencodinge$B$+$i$NJQ49$N\<:GT;~$K$I$&$9$k$+$H$+$OG:$^$7e(B  
e$B$$$G$9$,!#e(B

e$B%U%i%0$r;H$&Nc$@$H!"JQ49ITG=$JJ8;z$rG$0U$N;XDjJ8;z$KCV49$9$ke(B  
e$B$3$H$O$G$-$J$$$h$&$J5$$,$7$^$9$,!"Nc$($P%9%l%C%I%m!\<%+%k$JFCe(B  
e$B\<lJQ?t$G;XDj$9$k$H$+$$$&$3$H$r9M$($F$\*$i$l$^$9$+e(B?

| \>(3) C API  
| \> String#encodee$B$KAjEv$9$ke(BC APIe$B$,M\_$7$$$G$9!#e(B  
| \> e$B$^$“!”$=$N$^$^$J$ie(Bfuncalle$B$G$b$$$$$s$G$9$1$I!"$G$-$l$P$b$&e(B  
| \> e$B$A$g$C$He(BCe$B4s$j$NE[$,M\_$7$$$G$9$M!#e(B  
|  
| funcall e$B$He(B C API e$B$N$H$3$m$O$3$A$i$NJY6/ITB-$G$A$g$C$HJ,$+$j$^$;$s$,!"e(B  
| e$B6qBNE\*$KNc$($P$I$&$$$&Iw$Ke(B C e$B$N4X?t$r8F$S$?$$$G$9$+!#e(B

e$BJQ4985e(BCe$B%P%$%HG[Ns!“JQ4985e(Bencodinge$B!“JQ49@he(Bencodinge$B!“JQ49\<:GT;~e(B  
e$BBP1~J}K!!”$H$$$&$h$&$J0z?t$G8F$Y$k$H4r$7$$$G$9!#e(B  
e$BJQ49\<:GT;~BP1~J}K!$H$7$F!”%(%i!\<!”;XDjJ8;z$KCV$-49$(!“$N$$$:e(B  
e$B$l$+$rA\*$Y!”%(%i!\<;~$K$ONc30$G$J$/La$jCM$G\<($7$F$b$i$($k$H4re(B  
e$B$7$$$G$9$M!#e(B

| e$B;~4|E\*$K$O;0\<T$H$b$=$&1s$/$O$J$$$+$H;W$$$^$9$,!"3X9;$O:#0lHVe(B  
| e$BK;$7$$;~4|$J$N$GM\>$jJ]\>Z$O$G$-$J$$$H;W$$$^$9!#e(B

e$B;n83$H$+B4O@$H$+$G$7$g$&$+!#e(B  
e$B6[5^$K:$$C$F$$$k$o$1$G$O$J$/$F!“2]Bj$,$”$k$H$$$&%j%9%H%“%C%We(B  
e$B$N0UL#$GEj$2$?$b$N$G$9$N$G!”$I$&$+K\6H$N$[$&$rM%@h$7$F$/$@$5e(B  
e$B$$!#e(B  
e$B$\*K;$7$$$H$3$m?WB.$JJV?.$"$j$,$H$&$4$6$$$^$7$?!#e(B

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

---

<div class="post-metadata">

**Author:** ![U.Nakamura](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/b5ac83/32.png) [@U.Nakamura](https://www.ruby-forum.com/u/U.Nakamura)\
**Post date:** [January 21, 2008, 11:08am UTC](https://www.ruby-forum.com/t/requests-to-transcode/126672/3 "2008-01-21T11:08:15Z")

</div>

e$BCfB\<$5$s!"$3$s$K$A$O!#e(B

At 17:59 08/01/21, you wrote:

> e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B
> 
> transcodee$B$K4X$7$F!“e(B3e$BE@$[$IMWK\>$,$”$k$N$G$9$,!"e(B

e$BMWK\>$"$j$,$H$&$4$6$$$^$9!#;H$&?M$,$$$k$+M\>$jJ,$+$j$^$;$s$G$7$?!#e(B

> e$B$=$l$\>$l\<B8=2De(B  
> e$BG=@-e(B(e$B$H!"\<B8=$9$k$J$i;~4|e(B)e$B$O$I$s$J$b$s$G$7$g$&$+e(B?
> 
> (1) Windows-31Je$B%5%]!\<%He(B  
> e$B3N$+0JA0$Ke(BMartine$B@h@8$,BP1~M=Dj$H$_$C$7$c$C$F$_$i$l$?$H;We(B  
> e$B$$$^$9!#e(B  
> e$BJL$K5^$+$9$o$1$8$c$J$$$G$9$,!"0l1~3NG’$H$$$&$3$H$G!#e(B

e$B$3$A$i$G$O$b$&4{$K0l1~$d$C$?$s$G$9$,!“$=$N;~$K:#$Ne(B Shift\_JIS  
e$B$He(B EUC-JP e$B$N$H$3$m$K$$$/$D$+$N5?Ld$,$G$F$-$F!”$3$l$r$-$A$s$He(B  
e$B@v$$=P$7$FAjCL$7$h$&$H;W$C$F$$$^$9!#e(B

> (2) e$BJQ49$G$-$J$$J8;z$N07$$e(B  
> e$B8=\>u$OJQ49$G$-$J$$J8;z$,$“$k$HNc30$,H/@8$7$^$9$,!”$=$&$$e(B  
> e$B$&J8;z$r!Ve(B?e$B!W$d!V".!W$J$I$KCV$-49$($F=hM}$rB39T$7$?$$\>lLLe(B  
> e$B$b$=$l$J$j$K$“$k$H;W$$$^$9!#e(B  
> [ruby-core:15036]e$B$”$?$j$+$i$NOC$,$=$&$@$H;W$$$^$9$,!"$3$le(B  
> e$B$O$I$&$J$j$=$&$G$7$g$&$+e(B?

e$B$=$&$G$9$M!#\<BAu$O$o$j$H4JC1$G$9$,!“e(BAPI  
e$B$r7h$a$J$$$H9T$1$J$$$G$9!#e(B  
e$B:G=_E_$K%V%m%C%/$b$&$^$/;H$$$?$$$G$9$,!”$3$l$O$b$&\>/$7@h$@$H;W$$$^$9!#e(B  
e$B8=:_9M$($F$$$k$N$ONc$($Pe(B File.fnmatch  
e$B$_$?$$$J%U%i%0$r;H$&$3$H$G$9!#e(B

e$BNc$($Pe(B

s.encode(‘EUC-JP’, String::ENCODE\_SUBSTITUTE\_TARGET\_DEFAULT)  
e$B$H$+e(B  
s.encode(‘Shift\_JIS’, ‘UTF-8’, String::DROP\_BROKEN\_BYTES)  
e$B$H$+!#L^O@$b$&\>/$7C;$/$F$b$$$$$+$H;W$$$^$9e(B :-)e$B!#e(B

> (3) C API  
> String#encodee$B$KAjEv$9$ke(BC APIe$B$,M\_$7$$$G$9!#e(B  
> e$B$^$“!”$=$N$^$^$J$ie(Bfuncalle$B$G$b$$$$$s$G$9$1$I!"$G$-$l$P$b$&e(B  
> e$B$A$g$C$He(BCe$B4s$j$NE[$,M\_$7$$$G$9$M!#e(B

funcall e$B$He(B C API  
e$B$N$H$3$m$O$3$A$i$NJY6/ITB-$G$A$g$C$HJ,$+$j$^$;$s$,!"e(B  
e$B6qBNE\*$KNc$($P$I$&$$$&Iw$Ke(B C e$B$N4X?t$r8F$S$?$$$G$9$+!#e(B

e$B;~4|E\*$K$O;0\<T$H$b$=$&1s$/$O$J$$$+$H;W$$$^$9$,!"3X9;$O:#0lHVe(B  
e$BK;$7$$;~4|$J$N$GM\>$jJ]\>Z$O$G$-$J$$$H;W$$$^$9!#e(B

> e$B$\*4j$$$P$C$+$j$K$J$C$A$c$C$F$^$9$,!"FbMF$K$h$C$F$O\<BAuLL$G$\*e(B  
> e$B\<jEA$$$G$-$k$+$b$7$l$^$;$se(B(e$B$G$-$J$$$+$b$7$l$^$;$se(B)e$B!#e(B

e$B$"$j$,$H$&$4$6$$$^$7$?!#$3$l$+$i$b59$7$/$\*4j$$$7$^$9!#e(B Martin.

#-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University  
#-#-# [http://www.sw.it.aoyama.ac.jp](http://www.sw.it.aoyama.ac.jp)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![U.Nakamura](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/b5ac83/32.png) [@U.Nakamura](https://www.ruby-forum.com/u/U.Nakamura)\
**Post date:** [January 21, 2008, 11:43am UTC](https://www.ruby-forum.com/t/requests-to-transcode/126672/4 "2008-01-21T11:43:29Z")

</div>

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

Martin D. wrote:

> > (1) Windows-31Je$B%5%]!\<%He(B  
> > e$B3N$+0JA0$Ke(BMartine$B@h@8$,BP1~M=Dj$H$_$C$7$c$C$F$_$i$l$?$H;We(B  
> > e$B$$$^$9!#e(B  
> > e$BJL$K5^$+$9$o$1$8$c$J$$$G$9$,!"0l1~3NG’$H$$$&$3$H$G!#e(B
> 
> e$B$3$A$i$G$O$b$&4{$K0l1~$d$C$?$s$G$9$,!“$=$N;~$K:#$Ne(B Shift\_JIS  
> e$B$He(B EUC-JP e$B$N$H$3$m$K$$$/$D$+$N5?Ld$,$G$F$-$F!”$3$l$r$-$A$s$He(B  
> e$B@v$$=P$7$FAjCL$7$h$&$H;W$C$F$$$^$9!#e(B

Shift\_JIS e$B$He(B EUC-JP  
e$B$N5?Ld$C$F%^%C%T%s%0$NOC$G$9$+!)$=$l$G$7$?$i8e$G$G$be(B  
e$BD4@0$G$-$^$9$7!“$H$j$”$($:e(BWindows-31J e$B$r;H$$$?$$$G$9!#e(B

Shift\_JIS e$B$He(B EUC-JP e$B$Oe(B GNU libiconv  
e$B$"$?$j$K$=$m$($k$N$,L5Fq$J$N$G$9$+e(B  
e$B$M$'!&!&!&!"2~$a$F%^%C%T%s%08+D\>$7$F$\*$-$^$9!#e(B

> e$BNc$($Pe(B
> 
> s.encode(‘EUC-JP’, String::ENCODE\_SUBSTITUTE\_TARGET\_DEFAULT)  
> s.encode(‘Shift\_JIS’, ‘UTF-8’, String::DROP\_BROKEN\_BYTES)

Perl/Encode e$B$bDj?t$G%_%W%7%g%s$r;XDj$9$kJ}\<0$G$7$?$M!#Dj?t$Oe(B  
String e$B$NCfe(B  
e$B$J$N$+$J$!!&!&!&!"\>/$7e(B Encoding  
e$B$HLB$&$H$3$m$+$b$7$l$^$;$s!#\>-MhE_$K%Ve(B  
e$B%m%C%/$bMQ0U$9$kM=Dj$J$i$P!“CV49!&L5;k!&%(%i!\<$,$”$l$PEvLL$O2?$H$+$J$j$=e(B  
e$B$&$J5$$b$7$^$9!#e(B

e$B$A$J$\_$K$4B8CN$+$b$7$l$^$;$s$,!"e(BPerl/Encode  
e$B$@$H$3$s$J46$8$N$h$&$G$9!#e(B

> **[Encode - character encodings in Perl - metacpan.org](https://metacpan.org/dist/Encode/view/Encode.pm)**
>
> character encodings in Perl

---

<div class="post-metadata">

**Author:** ![U.Nakamura](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/b5ac83/32.png) [@U.Nakamura](https://www.ruby-forum.com/u/U.Nakamura)\
**Post date:** [January 22, 2008, 11:42pm UTC](https://www.ruby-forum.com/t/requests-to-transcode/126672/5 "2008-01-22T23:42:09Z")

</div>

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

U.Nakamura wrote:

> |  
> | e$BNc$($Pe(B  
> |  
> | s.encode(‘EUC-JP’, String::ENCODE\_SUBSTITUTE\_TARGET\_DEFAULT)  
> | e$B$H$+e(B  
> | s.encode(‘Shift\_JIS’, ‘UTF-8’, String::DROP\_BROKEN\_BYTES)  
> | e$B$H$+!#L^O@$b$&\>/$7C;$/$F$b$$$$$+$H;W$$$^$9e(B :-)e$B!#e(B
> 
> ruby-coree$B$K$"$C$?%V%m%C%/$r;H$&0F$O%9%^!\<%H$@$H$O;W$$$^$9!#e(B  
> statefule$B$Je(Bencodinge$B$+$i$NJQ49$N\<:GT;~$K$I$&$9$k$+$H$+$OG:$^$7e(B  
> e$B$$$G$9$,!#e(B

stateful encoding e$B$r=hM}$9$k$O!"e(BISO 2022  
e$B$K$D$$$F$J$i$PD\>A0$Ne(B escape  
sequence  
e$B$H$$$&$+!"8=:_$NJ8;z=89gHV9f$H%P%$%HNs$,$"$l$P$h$$$+$H!#$3$3$Ge(B  
1 byte  
e$B$r%V%m%C%/$KEO$9$+!“B?%P%$%HI,MW$J\>l9g$J$3$H$r9M$($FJ#?t%P%$%HEOe(B  
e$B$9$+!”$$$C$=$N$3$H%P%$%HNs$9$Y$F$H8=:_$Ne(B index  
e$B$rEO$9$+$,LB$$$I$3$m$G$9e(B  
e$B$+$M$’!#e(B

e$B:G8e$N$r;H$C$F!"$5$i$K$$$m$$$m\>pJs$rEO$7$?\>l9g!"$3$s$J46$8$G$7$g$&$+e(B  
“Ruby\e$B$k$S!\<9H6L\e(IYK^0\e(B”.encode(“UTF-8”) do |  
from, # encoding convert from  
to, # encoding convert to  
state, # current state integer  
bytes, # bytes string converting  
idx, # current index  
|  
if iso\_2022\_single\_byte\_charset(state)  
“\x%X” % bytes[idx]  
elsif bytes.length \>= idx + 1  
# e$B=\*N;e(B  
else  
# idx e$B$re(B2e$B$D?J$a$5$;$k=hM}e(B  
“\x%X” % [bytes[idx] \<\< 8 + bytes[idx+1]]  
end  
end

e$B\>pJs$r8:$i$7$F$9$C$-$j$5$;$?$$\>l9g$Oe(B  
“Ruby\e$B$k$S!\<9H6L\e(IYK^0\e(B”.encode(“UTF-8”) do |  
state, # current state integer  
bytes, # array of unknown byte  
|  
if iso\_2022\_single\_byte\_charset(state)  
“\x%X” % bytes[0]  
elsif buf.length == 0  
nil  
else  
“\x%X\x%X” % bytes  
end  
end

# e$B%V%m%C%/$+$i$NLa$jCM$,e(B

# nil: e$B\<!$N%P%$%H$rFI$s$Ge(B bytes

e$B$KDI2C$7!"%V%m%C%/$r8F$SD\>$9e(B

# string: bytes e$B$r6u$K$7$F\<!$N%P%$%H$N=hM}$rB39Te(B

e$BI|5l;~$Ke(B state e$B$NA`:n$b$7$?$$$H$J$k$H!"e(Bconverter  
e$B%\*%V%8%’%/%H$rJV$7$?J}e(B  
e$B$,$$$$$N$+$J$!!#e(B

> e$B%U%i%0$r;H$&Nc$@$H!"JQ49ITG=$JJ8;z$rG$0U$N;XDjJ8;z$KCV49$9$ke(B  
> e$B$3$H$O$G$-$J$$$h$&$J5$$,$7$^$9$,!"Nc$($P%9%l%C%I%m!\<%+%k$JFCe(B  
> e$B\<lJQ?t$G;XDj$9$k$H$+$$$&$3$H$r9M$($F$\*$i$l$^$9$+e(B?

e$B%(%s%3!\<%G%#%s%0$4$H$K%G%U%)%k%H$NCV49J8;z$,7h$^$C$F$$$k$N$G!“DL\>o$O$=$le(B  
e$B$rMQ$$$l$P$$$$$+$H!#JQ$($?$$\>l9g$O%V%m%C%/$G!#%O%C%7%e$J$j$GEO$9$H$$$&J}e(B  
e$BK!$b$”$k$G$7$g$&$M!#e(B

e$B\<B:]$N$H$3$m!"$"$^$jG$0U$NCV49J8;z$rMQ$$$?$$$H$$$&%K!\<%:$OB?$/$O$J$$5$$Oe(B  
e$B$7$^$9!#e(B

> e$BJQ49\<:GT;~BP1~J}K!$H$7$F!"%(%i!\<!";XDjJ8;z$KCV$-49$(!"$N$$$:e(B  
> e$B$l$+$rA\*$Y!"%(%i!\<;~$K$ONc30$G$J$/La$jCM$G\<($7$F$b$i$($k$H4re(B  
> e$B$7$$$G$9$M!#e(B

e$B;W$&$Ke(B mbsrtowcs e$BE\*$Je(B API e$B$K$D$$$F$NOC$@$H;W$$$^$9!#e(B

e$B$^$:0z?t$,e(B

- e$BJQ4985%(%s%3!\<%G%#%s%0e(B rb\_encoding \*src\_enc
- e$BJQ4985e(B char \*\*src\_p
- e$BJQ4985$N=\*$o$je(B char \*src\_e
- e$BJQ49@h%(%s%3!\<%G%#%s%0e(B rb\_encoding \*dest\_enc
- e$BJQ49@he(B char \*\*dest\_p
- e$BJQ49@h$N=\*$o$je(B char \*dest\_e
- e$BJQ49%\*%W%7%g%se(B int opt
- e$B\>uBVe(B e$BFH\<+$N9=B$BNe(B tcstate\_t \*state

e$BLa$jCM$Oe(B size\_t e$B$G!"e(B

- 0 e$B$^$?$O@5$NCMe(B: e$B@.8ye(B  
e$B\>:Ye(B:  
e$B85$N%P%$%HNs$r$9$Y$FJQ49$7=_$($?!#e(B  
e$BLa$jCM$OJQ49$K@.8y$7$?J8;z?t!#e(B  
fallback e$B$,e(B skip e$B$de(B replace e$B$N\>l9g$O\>o$K$3$l!#e(B  
e$B0z?t$NJQ2=e(B:  
src\_p: src\_e e$B$HEy$7$$e(B  
dest\_p: dest\_e e$B$HF1$8$+$=$l$h$jA0!#JQ498e$N%P%$%HNs$N=_$o$je(B  
state: e$B=i4|\>uBVe(B  
NOTE:  
e$B$3$3$Ge(B state e$B$O=i4|\>uBV$G$J$/e(B ascii only  
e$B$+$I$&$+$J$I$re(B  
e$B$D$C$3$s$G$\*$$$F$b$$$$$+$b!#e(B

- -1: e$BIT@5$J%P%$%HNse(B  
e$B\>:Ye(B:  
e$B85$N%(%s%3!\<%G%#%s%0$Ne(B CES  
e$B$H$7$FIT@5$J%P%$%H$,B8:\_$7$?!#e(B  
e$B0z?t$NJQ2=e(B:  
src\_p: e$BIT@5$J%P%$%HNs$N@hF,e(B  
dest\_p: e$BJQ49:Q$\_e(B+1  
state: e$BIT@5$J%P%$%HNs$rFI$`D\>A0$N\>uBVe(B  
NOTE:  
EILSEQ e$B$bI|5l$9$k$s$G$9$h$M!)e(Bmbrtowc e$B$de(B iconv  
e$B$O$3$3$GD|$a$^$9$,!#e(B

- -1: e$BIT40A4$J%P%$%HNse(B  
e$B\>:Ye(B:  
e$B85$N%(%s%3!\<%G%#%s%0$Ne(B CES  
e$B$H$7$FIT40A4$J%P%$%H$,B8:\_$7$?!#e(B  
e$B$h$&$O?,@Z$l%H%s%!#e(B  
e$B0z?t$NJQ2=e(B:  
src\_p: e$BIT40A4$J%P%$%HNs$N@hF,e(B  
dest\_p: e$BJQ49:Q$\_e(B+1  
state: e$BIT40A4$J%P%$%HNs$rFI$`D\>A0$N\>uBVe(B  
NOTE:  
stateful encoding e$B$N\>l9g$O!"e(Bshift sequence  
e$B$N\<!$NJ8;z$^$Ge(B  
e$BFI$s$@$H$3$m$G=i$a$F!VJ8;z!W$H$9$k!#e(B

- -3: e$BJQ49ITG=$JJ8;ze(B  
e$B\>:Ye(B:  
e$B85$N%(%s%3!\<%G%#%s%0$Ne(B CES e$B$H$7$F$OBEEv$@$,!"e(B  
e$BJQ49I=$K:$C$F$$$J$$Ey$NM}M3$GJQ49$G$-$J$$!#e(B  
e$B0z?t$NJQ2=e(B:  
src\_p: e$BJQ49ITG=$JJ8;z$r9=@.$9$k%P%$%HNs$N@hF,e(B  
dest\_p: e$BJQ49:Q$\_e(B+1  
state: e$BJQ49ITG=$JJ8;z$r9=@.$9$k%P%$%HNs$rFI$`D\>A0$N\>uBVe(B  
NOTE:  
e$B$I$3$^$G$,$=$N!VJQ49ITG=$JJ8;z!W$J$N$+$,J,$+$i$J$$!#e(B  
state e$B$NJ}$G2?$H$+$9$k$+!#e(B

- -4: e$BMFNL%\*!\<%P!\<e(B  
e$B\>:Ye(B:  
dest\_p == dest\_e e$B$K$J$C$F$7$^$C$?e(B  
e$B0z?t$NJQ2=e(B:  
src\_p: e$BL$JQ49$J%P%$%HNs$N@hF,e(B  
dest\_p: dest\_e e$B$HEy$7$$$+$=$N\>/$7A0e(B  
state: e$B:G8e$KJQ49@.8y$7$?\>uBVe(B

e$B;H$$J}$Oe(B

char \*src\_p = RSTRING\_PTR(str);  
char \*src\_e = RSTRING\_END(str);  
char \*\*src\_pp = &src\_p;

while (\*src\_pp != src\_e) {  
tcstate\_t state = 0;  
size\_t err = 0;  
err = transcode\_convert(  
enc\_windows\_31j, src\_pp, src\_e,  
enc\_utf\_8, dest\_pp, dest\_e,  
TRANSCODE\_FB\_ERROR, &state);  
if (err \>= 0) break;  
switch(err) {  
case -1:  
\*(dest\_pp++) = ‘?’;  
break;  
case -2:  
static const \*hex\_tbl = “0123456789ABCDEF”;  
\*(dest\_pp++) = ‘\’;  
\*(dest\_pp++) = ‘x’;  
\*(dest\_pp++) = hex\_tbl[((\*src\_pp)\>\>8)&0xF];  
\*(dest\_pp++) = hex\_tbl[((\*src\_pp) )&0xF];  
break;  
case -3:  
// expand  
break;  
default:  
// reserved  
break;  
}  
src\_pp++;  
}

e$BJY6/ITB-$J$;$$$G$3$l$G==J,$+$o$+$j$^$;$s$,!"$?$V$sBgBN$3$s$J46$8$G$7$g$&$+!#e(B

---

<div class="post-metadata">

**Author:** ![U.Nakamura](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/b5ac83/32.png) [@U.Nakamura](https://www.ruby-forum.com/u/U.Nakamura)\
**Post date:** [January 23, 2008, 2:03am UTC](https://www.ruby-forum.com/t/requests-to-transcode/126672/6 "2008-01-23T02:03:18Z")

</div>

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

In message “[ruby-dev:33286] Re: requests to transcode”  
on Jan.23,2008 07:41:13, [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:  
| stateful encoding e$B$r=hM}$9$k$O!"e(BISO 2022 e$B$K$D$$$F$J$i$PD\>A0$Ne(B escape  
| sequence e$B$H$$$&$+!"8=:_$NJ8;z=89gHV9f$H%P%$%HNs$,$"$l$P$h$$$+$H!#$3$3$Ge(B  
| 1 byte e$B$r%V%m%C%/$KEO$9$+!“B?%P%$%HI,MW$J\>l9g$J$3$H$r9M$($FJ#?t%P%$%HEOe(B  
| e$B$9$+!”$$$C$=$N$3$H%P%$%HNs$9$Y$F$H8=:_$Ne(B index e$B$rEO$9$+$,LB$$$I$3$m$G$9e(B  
| e$B$+$M$'!#e(B

e$B$“$s$^$j$?$/$5$s%V%m%C%/$K0z?t$rEO$9$h$&$K$7$F$b=q$-4V0c$($ke(B  
e$B$@$1$J$N$G!”@.@%$5$s$Ne(B2e$B$DL$N0F$N$h$&$Ke(B2e$B8DDxEY$KN1$a$k$+!“\>pe(B  
e$BJs$r$^$H$a$?%/%i%9$N%$%s%9%?%s%9$re(B1e$B8DEO$9$+!”$I$A$i$+$,8=\<BE_e(B  
e$B$G$7$g$&$M!#e(B  
e$B$H$j$"$($:8e\<T$K$7$F$_$1$P8e$G;EMM$rDI2C$G$-$k$N$G!"\<BAu$9$ke(B  
e$BJ}$O5$$,3Z$+$b$7$l$^$;$s!#e(B

| \> e$B%U%i%0$r;H$&Nc$@$H!"JQ49ITG=$JJ8;z$rG$0U$N;XDjJ8;z$KCV49$9$ke(B  
| \> e$B$3$H$O$G$-$J$$$h$&$J5$$,$7$^$9$,!"Nc$($P%9%l%C%I%m!\<%+%k$JFCe(B  
| \> e$B\<lJQ?t$G;XDj$9$k$H$+$$$&$3$H$r9M$($F$\*$i$l$^$9$+e(B?  
|  
| e$B%(%s%3!\<%G%#%s%0$4$H$K%G%U%)%k%H$NCV49J8;z$,7h$^$C$F$$$k$N$G!“DL\>o$O$=$le(B  
| e$B$rMQ$$$l$P$$$$$+$H!#JQ$($?$$\>l9g$O%V%m%C%/$G!#%O%C%7%e$J$j$GEO$9$H$$$&J}e(B  
| e$BK!$b$”$k$G$7$g$&$M!#e(B

e$B!V7h$^$C$F$k!W$H$$$&$N$O!"2?$G7h$^$C$F$k$s$G$7$g$&e(B?

# e$BITJY6/$G$9$\_$^$;$se(B

e$B%V%m%C%/EO$;$k$h$&$K$J$l$P$I$&$K$G$b$J$k$N$G!“$=$&$$$&J}8~$@e(B  
e$B$H$$$&$3$H$,7h$^$k$N$J$i!”;H$&J}$H$7$F$O$"$^$j5$$K$O$J$j$^$;e(B  
e$B$s$1$I$M!#e(B

| \> e$BJQ4985e(BCe$B%P%$%HG[Ns!“JQ4985e(Bencodinge$B!“JQ49@he(Bencodinge$B!“JQ49\<:GT;~e(B  
| \> e$BBP1~J}K!!”$H$$$&$h$&$J0z?t$G8F$Y$k$H4r$7$$$G$9!#e(B  
| \> e$BJQ49\<:GT;~BP1~J}K!$H$7$F!”%(%i!\<!”;XDjJ8;z$KCV$-49$(!“$N$$$:e(B  
| \> e$B$l$+$rA\*$Y!”%(%i!\<;~$K$ONc30$G$J$/La$jCM$G\<($7$F$b$i$($k$H4re(B  
| \> e$B$7$$$G$9$M!#e(B  
|  
| e$B;W$&$Ke(B mbsrtowcs e$BE\*$Je(B API e$B$K$D$$$F$NOC$@$H;W$$$^$9!#e(B

e$B$“$”!“$$$d!”$J$s$H$$$&$+!"C1$Ke(B  
rb\_funcall(str, rb\_intern(“encode”), 1, enc);  
e$B$H=q$+$:$KD\>@\e(Brb\_str\_transcode()e$BAjEv$r8F$S$?$+$C$?$@$1$H$$$&e(B  
e$B$@$1$G$9!#e(B  
e$B$?$@$7e(Brb\_str\_transcode()e$B$=$N$b$N$Oe(Brubye$B%$%s%?%W%j%?I\>2A4o$+$ie(B  
e$B8F$P$l$k$3$HA0Ds$J$N$G!“e(Bargve$B$r$P$i$7$?\>uBV$G8F$Y$k$b$N$,M\_$7e(B  
e$B$$$J!”$H$$$&$=$l$@$1e(B…

e$BJQ49\<:GT;~BP1~J}K!$H$$$&0z?t$,$"$k$H$$$$$H$$$&$N$O!“e(BString#encode  
e$B\<+BN$,$=$&$$$&J}8~$K$J$k$O$:$J$N$G!”$H$$$&$@$1$G$9!#e(B

e$B$H$$$o$o$1$G!“La$jCM$Oe(BVALUE(String)e$B$G$$$$$G$9$7!”\<:GT$Oe(Bnile$B$Ge(B  
e$B65$($F$/$l$l$P$b$&==J,$G!"8F$s$@B&$O\<:GT$7$F$?$i8e$O;`$L$J$je(B  
e$B2?$J$j$9$l$P$$$$$d$H;W$C$F$$$?$N$G\<:GT$7$?$H$3$m$+$i:F3+$H$+e(B  
e$B$OA4A39M$($F$$$^$;$s$G$7$?!#e(B

| e$BJY6/ITB-$J$;$$$G$3$l$G==J,$+$o$+$j$^$;$s$,!"$?$V$sBgBN$3$s$J46$8$G$7$g$&$+!#e(B

e$B==J,$H$$$&$+!“I!7l$,e(B 🙂  
e$B;d$H$7$F$O$3$3$^$G@8$J$b$N$,M\_$7$+$C$?$o$1$G$O$J$/$F!”\>e=R$Ne(B  
e$BDL$j$G$9!#e(B

e$B@.@%$5$s$N0F$O!“e(BString#encodee$B$N%V%m%C%/0z?t$D$-HG$KBP1~$7$?e(BAPI  
e$B$H$$$&$3$H$K$J$k$+$H;W$&$N$G$9$,!”$3$l$O$^$“$3$l$H$7$F!”;d$,e(B  
e$BM\_$7$+$C$?$N$O$b$C$H\<j7Z$K8F$Y$k%7%s%W%k$JE[$G$9!"$O$$!#e(B

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

---

<div class="post-metadata">

**Author:** ![U.Nakamura](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/b5ac83/32.png) [@U.Nakamura](https://www.ruby-forum.com/u/U.Nakamura)\
**Post date:** [January 23, 2008, 4:59am UTC](https://www.ruby-forum.com/t/requests-to-transcode/126672/7 "2008-01-23T04:59:54Z")

</div>

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

U.Nakamura wrote:

> e$BJs$r$^$H$a$?%/%i%9$N%$%s%9%?%s%9$re(B1e$B8DEO$9$+!"$I$A$i$+$,8=\<BE_e(B  
> e$B$G$7$g$&$M!#e(B  
> e$B$H$j$"$($:8e\<T$K$7$F$_$1$P8e$G;EMM$rDI2C$G$-$k$N$G!"\<BAu$9$ke(B  
> e$BJ}$O5$$,3Z$+$b$7$l$^$;$s!#e(B

e$B$=$l$@$He(B converer e$B0l$D$G$9$+$M$’!#e(B  
e$BI,MW$J\>pJs$Oe(B [ruby-dev:33286] e$B$Ne(Bmbsrtowcs e$BIwe(B API  
e$B$HF1$8$J$N$G!"8e$O$=$le(B  
e$B$r$I$&5M$a9~$`$+$H!"e(Bstate e$B$r$I$&J];}$7$I$&JV$9$+$G$7$g$&$+!#e(B

> | \> e$B%U%i%0$r;H$&Nc$@$H!"JQ49ITG=$JJ8;z$rG$0U$N;XDjJ8;z$KCV49$9$ke(B  
> | \> e$B$3$H$O$G$-$J$$$h$&$J5$$,$7$^$9$,!"Nc$($P%9%l%C%I%m!\<%+%k$JFCe(B  
> | \> e$B\<lJQ?t$G;XDj$9$k$H$+$$$&$3$H$r9M$($F$\*$i$l$^$9$+e(B?  
> |  
> | e$B%(%s%3!\<%G%#%s%0$4$H$K%G%U%)%k%H$NCV49J8;z$,7h$^$C$F$$$k$N$G!“DL\>o$O$=$le(B  
> | e$B$rMQ$$$l$P$$$$$+$H!#JQ$($?$$\>l9g$O%V%m%C%/$G!#%O%C%7%e$J$j$GEO$9$H$$$&J}e(B  
> | e$BK!$b$”$k$G$7$g$&$M!#e(B
> 
> e$B!V7h$^$C$F$k!W$H$$$&$N$O!"2?$G7h$^$C$F$k$s$G$7$g$&e(B?
> 
> # e$BITJY6/$G$9$\_$^$;$se(B

e$B$"!"%&%=$G$9!#e(B  
ICU e$B$d$=$l$r0z$$$F$ke(B Encode e$B$Oe(B ucm e$B%U%!%$%kCf$Ne(B  
 e$B$G!“e(B  
Citrus e$B$N\>l9g$O%(%s%3!\<%G%#%s%0Dj5A%U%!%$%k$Ne(B INVALID e$B$G!“e(B  
e$B!V\<BAu$,7h$a$F$k!W%1!\<%9$,B?$$!”$G$9$M!#e(B  
e$B$C$H!”;W$C$?$ie(B GNU libiconv  
e$B$O%\*%W%7%g%s$GM?$($5$;$F$$$^$7$?!#e(B

e$B$H$$$&$+!"$3$l$C$F$h$/$h$/9M$($k$H!"e(B

- e$B%(%i!\<e(B
- e$BL5;ke(B
- e$BFCDj$NCV49J8;ze(B
- e$BBP1~$9$kJ8;zNse(B (U+XXXXe$B$de(B\xXXe$B$de(B\uXXXXe$B$J$Ie(B)  
e$B$K$J$k$o$1$G!“L5;k$r6uJ8;z!“BP1~$9$kJ8;zNs$r%U%)!\<%^%C%HJ8;zNs$HFI$\_BX$(e(B  
e$B$l$P!”%(%i!\<0J30$Oe(B string  
e$B$J$o$1$G!”$3$l$C$FDj?t$8$c$J$/$FJ8;zNs$G$$$$5$e(B  
e$B$,$7$F$-$^$7$?!#e(B

e$B$D$^$j!"0J2\<$NDL$j!#e(B

- e$B%(%i!\<e(B: nil
- e$BL5;ke(B: “”
- e$BCV49J8;ze(B: “?” “e$B”.e(B" “\uFFFD” e$BEye(B
- e$BBP1~$9$kJ8;zNse(B “U+%4X” “\x%2X” “\u{%X}” e$BEye(B

e$B$C$H!";W$C$?$N$G$9$,!"%P%$%H$H$7$FIT@5$J\>l9g$HJQ49$G$-$J$$J8;z$N\>l9g$GOCe(B  
e$B$,0c$&$h$&$J5$$,$A$i$j!#$b$&$A$g$C$H@0M}$,I,MW$+$b!#e(Bmb2mb  
e$B$C$F0EL[$Ke(B  
mb.valid? -\> mb2wc -\> wc2mb  
e$B$7$F$k$N$G!"$I$NCJ3,$G;`$s$@$+$K$h$C$FOC$,JQe(B  
e$B$o$k$s$G$9$h$M!#e(B

# e$B$=$&$$$($PB?CJJQ49$C$F$N$b$"$C$?$J$!!&!&!&!#e(B

> e$B$H=q$+$:$KD\>@\e(Brb\_str\_transcode()e$BAjEv$r8F$S$?$+$C$?$@$1$H$$$&e(B  
> e$B$@$1$G$9!#e(B  
> e$B$?$@$7e(Brb\_str\_transcode()e$B$=$N$b$N$Oe(Brubye$B%$%s%?%W%j%?I\>2A4o$+$ie(B  
> e$B8F$P$l$k$3$HA0Ds$J$N$G!“e(Bargve$B$r$P$i$7$?\>uBV$G8F$Y$k$b$N$,M\_$7e(B  
> e$B$$$J!”$H$$$&$=$l$@$1e(B…

e$B$"!\<!"$J$k$[$I!#ESCf$G$b$&$A$g$C$H\>e$N%l%$%d!\<%+%J!\<$C$F5$$O$7$?$s$G$9e(B  
e$B$,!"$^$!HwK:O?Be$j$K$^$H$a$F$b$$$$$+$J!\<$H!#e(B

> e$BJQ49\<:GT;~BP1~J}K!$H$$$&0z?t$,$"$k$H$$$$$H$$$&$N$O!“e(BString#encode  
> e$B\<+BN$,$=$&$$$&J}8~$K$J$k$O$:$J$N$G!”$H$$$&$@$1$G$9!#e(B
> 
> e$B$H$$$o$o$1$G!“La$jCM$Oe(BVALUE(String)e$B$G$$$$$G$9$7!”\<:GT$Oe(Bnile$B$Ge(B  
> e$B65$($F$/$l$l$P$b$&==J,$G!"8F$s$@B&$O\<:GT$7$F$?$i8e$O;`$L$J$je(B  
> e$B2?$J$j$9$l$P$$$$$d$H;W$C$F$$$?$N$G\<:GT$7$?$H$3$m$+$i:F3+$H$+e(B  
> e$B$OA4A39M$($F$$$^$;$s$G$7$?!#e(B

e$B$?$V$s!"!V2?$J$j$9$k!W$?$a$K:F3+$,I,MW$8$c$J$$$+$J!\<$H;W$$$^$9!"$?$V$s!#e(B

> e$B@.@%$5$s$N0F$O!“e(BString#encodee$B$N%V%m%C%/0z?t$D$-HG$KBP1~$7$?e(BAPI  
> e$B$H$$$&$3$H$K$J$k$+$H;W$&$N$G$9$,!”$3$l$O$^$"$3$l$H$7$F!";d$,e(B  
> e$BM\_$7$+$C$?$N$O$b$C$H\<j7Z$K8F$Y$k%7%s%W%k$JE[$G$9!"$O$$!#e(B

e$B%V%m%C%/0z?tIU$-HG$re(B e$B=c?h$Je(B C  
e$B$N%l%$%d!\<$G$d$k$H$3$&$J$C$F$7$^$&$H$$$&Nce(B  
e$B$G$9$+$M!#\<:GT$7$?$iL5;k$+$=$N$^$^;`$s$G$7$^$&$J$iBgI}$K%7%s%W%k$K$J$k$Ge(B  
e$B$7$g$&!#e(B

e$B$?$@!"\<:GT$r5\_$_$&$H$9$k$H:F3+$dCfCG\>l=j$N\>pJs$,I,MW$K$J$C$F!":F3+2DG=$Ke(B  
e$B$9$k$H\>uBV$,I,MW$K$J$k$H$$$&$h$&$K\>pJs$,A}$($F$$$/$N$G!"$H$j$^$o$7$OB?\>/e(B  
e$B3Z$K$J$C$F$b!"K\<AE_$KI,MW$J\>pJs$O$"$^$jJQ$o$i$J$$$+$J$!$H5$$b$7$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![U.Nakamura](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/b5ac83/32.png) [@U.Nakamura](https://www.ruby-forum.com/u/U.Nakamura)\
**Post date:** [January 23, 2008, 5:17am UTC](https://www.ruby-forum.com/t/requests-to-transcode/126672/8 "2008-01-23T05:17:25Z")

</div>

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

In message “[ruby-dev:33295] Re: requests to transcode”  
on Jan.23,2008 12:59:04, [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:  
| \> e$B$“$s$^$j$?$/$5$s%V%m%C%/$K0z?t$rEO$9$h$&$K$7$F$b=q$-4V0c$($ke(B  
| \> e$B$@$1$J$N$G!”@.@%$5$s$Ne(B2e$B$DL$N0F$N$h$&$Ke(B2e$B8DDxEY$KN1$a$k$+!“\>pe(B  
| \> e$BJs$r$^$H$a$?%/%i%9$N%$%s%9%?%s%9$re(B1e$B8DEO$9$+!”$I$A$i$+$,8=\<BE_e(B  
| \> e$B$G$7$g$&$M!#e(B  
| \> e$B$H$j$"$($:8e\<T$K$7$F$_$1$P8e$G;EMM$rDI2C$G$-$k$N$G!"\<BAu$9$ke(B  
| \> e$BJ}$O5$$,3Z$+$b$7$l$^$;$s!#e(B  
|  
| e$B$=$l$@$He(B converer e$B0l$D$G$9$+$M$'!#e(B  
| e$BI,MW$J\>pJs$Oe(B [ruby-dev:33286] e$B$Ne(Bmbsrtowcs e$BIwe(B API e$B$HF1$8$J$N$G!"8e$O$=$le(B  
| e$B$r$I$&5M$a9~$`$+$H!"e(Bstate e$B$r$I$&J];}$7$I$&JV$9$+$G$7$g$&$+!#e(B

e$B$H!"$J$k$H;W$$$^$9!#e(B

| \> | e$B%(%s%3!\<%G%#%s%0$4$H$K%G%U%)%k%H$NCV49J8;z$,7h$^$C$F$$$k$N$G!“DL\>o$O$=$le(B  
| \> | e$B$rMQ$$$l$P$$$$$+$H!#JQ$($?$$\>l9g$O%V%m%C%/$G!#%O%C%7%e$J$j$GEO$9$H$$$&J}e(B  
| \> | e$BK!$b$”$k$G$7$g$&$M!#e(B  
| \>  
| \> e$B!V7h$^$C$F$k!W$H$$$&$N$O!“2?$G7h$^$C$F$k$s$G$7$g$&e(B?  
| \> # e$BITJY6/$G$9$\_$^$;$se(B  
|  
| e$B$”!"%&%=$G$9!#e(B  
| ICU e$B$d$=$l$r0z$$$F$ke(B Encode e$B$Oe(B ucm e$B%U%!%$%kCf$Ne(B e$B$G!“e(B  
| Citrus e$B$N\>l9g$O%(%s%3!\<%G%#%s%0Dj5A%U%!%$%k$Ne(B INVALID e$B$G!“e(B  
| e$B!V\<BAu$,7h$a$F$k!W%1!\<%9$,B?$$!”$G$9$M!#e(B  
| e$B$C$H!”;W$C$?$ie(B GNU libiconv e$B$O%\*%W%7%g%s$GM?$($5$;$F$$$^$7$?!#e(B

e$B$J$k$[$I!#e(B  
nkfe$B$b%\*%W%7%g%s$GM?$($5$;$F$$$^$9$h$M!#e(B

| e$B$H$$$&$+!"$3$l$C$F$h$/$h$/9M$($k$H!"e(B  
| \* e$B%(%i!\<e(B  
| \* e$BL5;ke(B  
| \* e$BFCDj$NCV49J8;ze(B  
| \* e$BBP1~$9$kJ8;zNse(B (U+XXXXe$B$de(B\xXXe$B$de(B\uXXXXe$B$J$Ie(B)  
| e$B$K$J$k$o$1$G!“L5;k$r6uJ8;z!“BP1~$9$kJ8;zNs$r%U%)!\<%^%C%HJ8;zNs$HFI$\_BX$(e(B  
| e$B$l$P!”%(%i!\<0J30$Oe(B string e$B$J$o$1$G!”$3$l$C$FDj?t$8$c$J$/$FJ8;zNs$G$$$$5$e(B  
| e$B$,$7$F$-$^$7$?!#e(B  
|  
| e$B$D$^$j!“0J2\<$NDL$j!#e(B  
| \* e$B%(%i!\<e(B: nil  
| \* e$BL5;ke(B: “”  
| \* e$BCV49J8;ze(B: “?” “e$B”.e(B” “\uFFFD” e$BEye(B  
| \* e$BBP1~$9$kJ8;zNse(B “U+%4X” “\x%2X” “\u{%X}” e$BEye(B

e$B;d$b$=$N$h$&$K;W$$$^$9!#e(B  
e$B:G8e$N$,HyL/$J$H$3$m$G$9$,!“$3$&$$$&J#;($J$N$O%V%m%C%/M?$($?e(B  
e$B\>l9g$KG$$;$k!”$H$$$&$3$H$G$$$$$s$8$c$J$$$+$H$b;W$$$^$9!#e(B

| e$B$C$H!“;W$C$?$N$G$9$,!”%P%$%H$H$7$FIT@5$J\>l9g$HJQ49$G$-$J$$J8;z$N\>l9g$GOCe(B  
| e$B$,0c$&$h$&$J5$$,$A$i$j!#$b$&$A$g$C$H@0M}$,I,MW$+$b!#e(Bmb2mb e$B$C$F0EL[$Ke(B  
| mb.valid? → mb2wc → wc2mb e$B$7$F$k$N$G!"$I$NCJ3,$G;`$s$@$+$K$h$C$FOC$,JQe(B  
| e$B$o$k$s$G$9$h$M!#e(B

e$B%P%$%H$H$7$FIT@5$J\>l9ge(B(e$B$D$^$jF~NO85J8;zNs$,IT@5$JJB$S$N\>l9ge(B)  
e$B$O!“$=$l0J9\_$b?.MQ$G$-$J$$$N$G!”;XDj$K$+$+$o$i$:%(%i!\<$K$9$ke(B  
e$B$7$+$J$$$H;W$$$^$9!#e(B  
e$B%V%m%C%/$rM?$($?\>l9g$O!“!V$=$l0J9\_!W$r%W%m%0%i%^$NCN\<1$G$J$se(B  
e$B$H$+$G$-$k$+$b$7$l$J$$$N$G!”$=$N\>l9g$O$^$"JLES!#e(B

| \> e$BJQ49\<:GT;~BP1~J}K!$H$$$&0z?t$,$“$k$H$$$$$H$$$&$N$O!“e(BString#encode  
| \> e$B\<+BN$,$=$&$$$&J}8~$K$J$k$O$:$J$N$G!”$H$$$&$@$1$G$9!#e(B  
| \>  
| \> e$B$H$$$o$o$1$G!“La$jCM$Oe(BVALUE(String)e$B$G$$$$$G$9$7!”\<:GT$Oe(Bnile$B$Ge(B  
| \> e$B65$($F$/$l$l$P$b$&==J,$G!“8F$s$@B&$O\<:GT$7$F$?$i8e$O;`$L$J$je(B  
| \> e$B2?$J$j$9$l$P$$$$$d$H;W$C$F$$$?$N$G\<:GT$7$?$H$3$m$+$i:F3+$H$+e(B  
| \> e$B$OA4A39M$($F$$$^$;$s$G$7$?!#e(B  
|  
| e$B$?$V$s!”!V2?$J$j$9$k!W$?$a$K:F3+$,I,MW$8$c$J$$$+$J!\<$H;W$$$^$9!”$?$V$s!#e(B

e$B$“!”$3$3$G$$$&!V2?$J$j!W$O!"5$$K$;$:J8;zNs\<N$F$k$H$+$=$&$$$&e(B  
e$B%l%Y%k$N=hM}$rA[Dj$7$F$$$^$7$?!#e(B

| \> e$B@.@%$5$s$N0F$O!“e(BString#encodee$B$N%V%m%C%/0z?t$D$-HG$KBP1~$7$?e(BAPI  
| \> e$B$H$$$&$3$H$K$J$k$+$H;W$&$N$G$9$,!”$3$l$O$^$“$3$l$H$7$F!”;d$,e(B  
| \> e$BM\_$7$+$C$?$N$O$b$C$H\<j7Z$K8F$Y$k%7%s%W%k$JE[$G$9!“$O$$!#e(B  
|  
| e$B%V%m%C%/0z?tIU$-HG$re(B e$B=c?h$Je(B C e$B$N%l%$%d!\<$G$d$k$H$3$&$J$C$F$7$^$&$H$$$&Nce(B  
| e$B$G$9$+$M!#\<:GT$7$?$iL5;k$+$=$N$^$^;`$s$G$7$^$&$J$iBgI}$K%7%s%W%k$K$J$k$Ge(B  
| e$B$7$g$&!#e(B  
|  
| e$B$?$@!”\<:GT$r5\_$_$&$H$9$k$H:F3+$dCfCG\>l=j$N\>pJs$,I,MW$K$J$C$F!“:F3+2DG=$Ke(B  
| e$B$9$k$H\>uBV$,I,MW$K$J$k$H$$$&$h$&$K\>pJs$,A}$($F$$$/$N$G!”$H$j$^$o$7$OB?\>/e(B  
| e$B3Z$K$J$C$F$b!"K\<AE_$KI,MW$J\>pJs$O$"$^$jJQ$o$i$J$$$+$J$!$H5$$b$7$^$9!#e(B

e$B$O$$!#e(B  
e$B\<:GT$r5\_$&$?$a$K$O\>:Y$J\>pJs$,I,MW$G!“$=$&$$$&$N$,M\_$7$$?M$Oe(B  
e$B$b$A$m$s$$$k$G$7$g$&$+$i!”@.@%$5$s0F%l%Y%k$Ne(BAPIe$B$b$\*$=$i$/I,MWe(B  
e$B$J$s$@$m$&$H;W$&$o$1$G$9$,!“;d$,M\_$7$$$N$O$b$C$H%F%-%H!\<$JE[e(B  
e$B$@$C$?!”$H$$$&$3$H$G$9!#e(B

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