# \[m17n\] String#encode

**URL:** <https://www.ruby-forum.com/t/m17n-string-encode/113923>\
**Category:** Development\
**Created:** [September 6, 2007, 7:08am UTC](https://www.ruby-forum.com/t/m17n-string-encode/113923 "2007-09-06T07:08:55Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [September 6, 2007, 7:08am UTC](https://www.ruby-forum.com/t/m17n-string-encode/113923/1 "2007-09-06T07:08:55Z")

</div>

e$B$J$+$@$G$9!#e(B

String#encodee$B$r$?$a$7$K\<BAu$7$F$\_$^$7$?!#e(B

e$B$J$\<$+e(B"sjis"e$B$GEPO?$5$l$F$$$k$N$Ke(B"Shift\_JIS"e$B$H=P$F$-$?$j$9$k$N$G!“e(B  
e$BJLL\>$rIU$1$i$l$k$h$&$K$7$Fe(Brb\_enc\_name()e$B$K$”$o$;$F$\_$^$7$?!#e(B

# Index: encoding.c

— encoding.c (revision 13347)  
+++ encoding.c (working copy)  
@@ -24,4 +24,5 @@ struct rb\_encoding\_entry {  
static struct rb\_encoding\_entry \*enc\_table;  
static int enc\_table\_size;  
+static st\_table \*enc\_table\_alias;

void  
@@ -44,10 +45,21 @@ rb\_enc\_register(const char \*name, rb\_enc

void  
+rb\_enc\_alias(const char \*alias, const char \*orig)  
+{

- if (!enc\_table\_alias) {
- enc\_table\_alias = st\_init\_strtable();
- }
- st\_insert(enc\_table\_alias, (st\_data\_t)alias, (st\_data\_t)orig);  
+}
- 

+void  
rb\_enc\_init(void)  
{  
rb\_enc\_register(“ascii”, ONIG\_ENCODING\_ASCII);

- rb\_enc\_register(“sjis”, ONIG\_ENCODING\_SJIS);

- rb\_enc\_register(“shift\_jis”, ONIG\_ENCODING\_SJIS);  
rb\_enc\_register(“euc-jp”, ONIG\_ENCODING\_EUC\_JP);  
rb\_enc\_register(“utf-8”, ONIG\_ENCODING\_UTF8);
- rb\_enc\_alias(“binary”, “ascii”);
- rb\_enc\_alias(“sjis”, “shift\_jis”);  
}

@@ -68,8 +80,10 @@ rb\_enc\_find(const char \*name)  
{  
int i;

- st\_data\_t alias = 0;

- find:  
for (i=0; i\<enc\_table\_size; i++) {  
if (strcmp(name, enc\_table[i].name) == 0) {  
@@ -77,4 +91,10 @@ rb\_enc\_find(const char \*name)  
}  
}

- if (!alias && enc\_table\_alias) {

- if (st\_lookup(enc\_table\_alias, (st\_data\_t)name, &alias)) {

- 

```
 name = (const char *)alias;

```

- 

```
 goto find;

```

- }

- }  
return ONIG\_ENCODING\_ASCII;  
}  
Index: string.c  
===================================================================  
— string.c (revision 13347)  
+++ string.c (working copy)  
@@ -194,5 +194,5 @@ rb\_tainted\_str\_new2(const char \*ptr)

static VALUE  
-str\_new3(VALUE klass, VALUE str)  
+str\_new\_shared(VALUE klass, VALUE str)  
{  
VALUE str2 = str\_alloc(klass);  
@@ -210,9 +210,17 @@ str\_new3(VALUE klass, VALUE str)  
FL\_SET(str2, ELTS\_SHARED);  
}

- rb\_enc\_copy((VALUE)str2, str);

+static VALUE  
+str\_new3(VALUE klass, VALUE str)  
+{

- VALUE str2 = str\_new\_shared(klass, str);
- 
- rb\_enc\_copy(str2, str);
- return str2;  
+}
- 

VALUE  
rb\_str\_new3(VALUE str)  
@@ -401,4 +409,21 @@ rb\_str\_init(int argc, VALUE \*argv, VALUE  
}

+static VALUE  
+rb\_str\_encode(VALUE str, VALUE encode)  
+{

- int idx = rb\_enc\_get\_index(str);
- rb\_encoding \*enc = rb\_enc\_find(StringValueCStr(encode));
- VALUE str2;
- 
- if (idx && rb\_enc\_from\_index(idx) != enc) {
- rb\_raise(rb\_eArgError, “cannot convert encoding from %s to %s”,
- 

```
rb_enc_name(rb_enc_from_index(idx)), rb_enc_name(enc));

```

- }
- str2 = str\_new\_shared(rb\_obj\_class(str), str);
- rb\_enc\_associate(str2, enc);
- OBJ\_INFECT(str2, str);
- return str2;  
+}
- 

static long  
str\_strlen(VALUE str, rb\_encoding \*enc)  
@@ -5429,4 +5454,5 @@ Init\_String(void)

```
 rb_define_method(rb_cString, "encoding", str_encoding, 0);

```

- rb\_define\_method(rb\_cString, “encode”, rb\_str\_encode, 1);

int rb\_enc\_to\_index(rb\_encoding\*);  
+int rb\_enc\_get\_index(VALUE obj);  
rb\_encoding\* rb\_enc\_get(VALUE);  
rb\_encoding\* rb\_enc\_check(VALUE,VALUE);  
@@ -65,4 +66,5 @@ int rb\_enc\_codelen(int, rb\_encoding\*);  
#define rb\_enc\_prev\_char(s,p,enc) (char  
_)onigenc\_get\_prev\_char\_head(enc,(UChar_)s,(UChar\*)p)

+#define rb\_enc\_isctype(c,t,enc) ONIGENC\_IS\_CODE\_CTYPE(enc,c,t)  
#define rb\_enc\_isascii(c,enc) ONIGENC\_IS\_CODE\_ASCII©  
#define rb\_enc\_isalpha(c,enc) ONIGENC\_IS\_CODE\_ALPHA(enc,c)

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [September 28, 2007, 11:01am UTC](https://www.ruby-forum.com/t/m17n-string-encode/113923/2 "2007-09-28T11:01:35Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:31744] [m17n] String#encode”  
on Thu, 6 Sep 2007 14:08:26 +0900, Nobuyoshi N.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|String#encodee$B$r$?$a$7$K\<BAu$7$F$_$^$7$?!#e(B  
|  
|e$B$J$\<$+e(B"sjis"e$B$GEPO?$5$l$F$$$k$N$Ke(B"Shift\_JIS"e$B$H=P$F$-$?$j$9$k$N$G!“e(B  
|e$BJLL\>$rIU$1$i$l$k$h$&$K$7$Fe(Brb\_enc\_name()e$B$K$”$o$;$F$_$^$7$?!#e(B

encodee$B$H$$$&L\>A0$OJQ49$r%$%a!\<%8$5$;$k$N$G$h$/$J$$$J$“$H;W$&e(B  
e$B$h$&$K$J$j$^$7$?!#$7$+$7!”$^!"L\>A0$O8e$GJQ$($k$3$H$K$7$F%3%\_%Ce(B  
e$B%H$7$F$/$@$5$$$^$;$s$+!)e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [September 28, 2007, 10:02am UTC](https://www.ruby-forum.com/t/m17n-string-encode/113923/3 "2007-09-28T10:02:58Z")

</div>

e$B$J$+$@$G$9!#e(B

At Thu, 6 Sep 2007 14:08:26 +0900,  
Nobuyoshi N. wrote in [ruby-dev:31744]:

> e$B$J$\<$+e(B"sjis"e$B$GEPO?$5$l$F$$$k$N$Ke(B"Shift\_JIS"e$B$H=P$F$-$?$j$9$k$N$G!“e(B  
> e$BJLL\>$rIU$1$i$l$k$h$&$K$7$Fe(Brb\_enc\_name()e$B$K$”$o$;$F$\_$^$7$?!#e(B

rb\_enc\_name()e$B$OBgJ8;z$r4^$`L\>A0$r;H$C$F$$$k$N$K!"\>.J8;z$G$7$+8!e(B  
e$B:w$G$-$J$$$H$$$&$N$OHs\>o$KITJX$J$N$G!"J8;z%1!\<%9$OL5;k$9$k$h$&$Ke(B  
e$B$7$F$\_$^$7$?!#e(B

# Index: encoding.c

— encoding.c (revision 13544)  
+++ encoding.c (working copy)  
@@ -24,4 +24,5 @@ struct rb\_encoding\_entry {  
static struct rb\_encoding\_entry \*enc\_table;  
static int enc\_table\_size;  
+static st\_table \*enc\_table\_alias;

void  
@@ -44,10 +45,22 @@ rb\_enc\_register(const char \*name, rb\_enc

void  
+rb\_enc\_alias(const char \*alias, const char \*orig)  
+{

- if (!enc\_table\_alias) {
- enc\_table\_alias = st\_init\_strcasetable();
- }
- st\_insert(enc\_table\_alias, (st\_data\_t)alias, (st\_data\_t)orig);  
+}
- 

+void  
rb\_enc\_init(void)  
{

- rb\_enc\_register(“ascii”, ONIG\_ENCODING\_ASCII);
- rb\_enc\_register(“sjis”, ONIG\_ENCODING\_SJIS);
- rb\_enc\_register(“euc-jp”, ONIG\_ENCODING\_EUC\_JP);
- rb\_enc\_register(“utf-8”, ONIG\_ENCODING\_UTF8);  
+#define enc\_register(enc) rb\_enc\_register(rb\_enc\_name(enc), enc)

- ENC\_REGISTER(ONIG\_ENCODING\_ASCII);
- ENC\_REGISTER(ONIG\_ENCODING\_SJIS);
- ENC\_REGISTER(ONIG\_ENCODING\_EUC\_JP);
- ENC\_REGISTER(ONIG\_ENCODING\_UTF8);
- rb\_enc\_alias(“binary”, “ascii”);
- rb\_enc\_alias(“sjis”, “shift\_jis”);  
}

@@ -64,18 +77,35 @@ rb\_enc\_from\_index(int index)  
}

-rb\_encoding \*  
-rb\_enc\_find(const char \*name)  
+int  
+rb\_enc\_find\_index(const char \*name)  
{  
int i;

- st\_data\_t alias = 0;

- if (!name) return -1;  
if (!enc\_table) {  
rb\_enc\_init();  
}

- find:  
for (i=0; i\<enc\_table\_size; i++) {

- if (strcmp(name, enc\_table[i].name) == 0) {
- 

```
 return enc_table[i].enc;

```

- if (strcasecmp(name, enc\_table[i].name) == 0) {
- 

```
 return i;

```

}  
}

- return ONIG\_ENCODING\_ASCII;

- if (!alias && enc\_table\_alias) {
- if (st\_lookup(enc\_table\_alias, (st\_data\_t)name, &alias)) {
- 

```
 name = (const char *)alias;

```

- 

```
 goto find;

```

- }
- }
- return -1;  
+}
- 

+rb\_encoding \*  
+rb\_enc\_find(const char \*name)  
+{

- rb\_encoding \*enc = rb\_enc\_from\_index(rb\_enc\_find\_index(name));
- if (!enc) enc = ONIG\_ENCODING\_ASCII;
- return enc;  
}

@@ -164,5 +194,5 @@ rb\_enc\_get\_index(VALUE obj)  
int i;

- enc\_check\_capable(obj);

- if (!enc\_capable(obj)) return -1;  
i = ENCODING\_GET(obj);  
if (i == ENCODING\_INLINE\_MAX) {  
Index: st.c  
===================================================================  
— st.c (revision 13544)  
+++ st.c (working copy)  
@@ -53,4 +53,10 @@ static const struct st\_hash\_type type\_st  
};

+static int strcasehash(const char \*);  
+static const struct st\_hash\_type type\_strcasehash = {

- strcasecmp,
- strcasehash,  
+};
- 

static void rehash(st\_table \*);

@@ -203,4 +209,16 @@ st\_init\_strtable\_with\_size(int size)  
}

+st\_table\*  
+st\_init\_strcasetable(void)  
+{

- return st\_init\_table(&type\_strcasehash);  
+}
- 

+st\_table\*  
+st\_init\_strcasetable\_with\_size(int size)  
+{

- return st\_init\_table\_with\_size(&type\_strcasehash, size);  
+}
- 

void  
st\_clear(st\_table \*table)  
@@ -815,4 +833,23 @@ strhash(register const char \*string)  
}

+static int  
+strcasehash(register const char \*string)  
+{

- register unsigned int hval = FNV1\_32A\_INIT;
- 
- /\*
- 

```
* FNV-1a hash each octet in the buffer

```

- 

```
*/

```

- while (\*string) {
- unsigned int c = (unsigned char)\*string++;
- if ((unsigned int)(c - ‘A’) \> (‘Z’ - ‘A’)) c += ‘a’ - ‘A’;
- hval ^= c;
- 
- /\* multiply by the 32 bit FNV magic prime mod 2^32 \*/
- hval \*= FNV\_32\_PRIME;
- }
- return hval;  
+}
- 

# int st\_numcmp(st\_data\_t x, st\_data\_t y) Index: include/ruby/encoding.h

— include/ruby/encoding.h (revision 13544)  
+++ include/ruby/encoding.h (working copy)  
@@ -40,6 +40,8 @@ typedef OnigEncodingType rb\_encoding;  
int rb\_enc\_to\_index(rb\_encoding\*);  
int rb\_enc\_get\_index(VALUE obj);  
+int rb\_enc\_find\_index(const char _name);  
rb\_encoding_ rb\_enc\_get(VALUE);  
rb\_encoding\* rb\_enc\_check(VALUE,VALUE);  
+void rb\_enc\_associate\_index(VALUE, int);  
void rb\_enc\_associate(VALUE, rb\_encoding\*);  
void rb\_enc\_copy(VALUE, VALUE);  
@@ -77,4 +79,5 @@ int rb\_enc\_codelen(int, rb\_encoding\*);  
#define rb\_enc\_prev\_char(s,p,enc) (char  
_)onigenc\_get\_prev\_char\_head(enc,(UChar_)s,(UChar\*)p)

# +#define rb\_enc\_isctype(c,t,enc) ONIGENC\_IS\_CODE\_CTYPE(enc,c,t) #define rb\_enc\_isascii(c,enc) ONIGENC\_IS\_CODE\_ASCII© #define rb\_enc\_isalpha(c,enc) ONIGENC\_IS\_CODE\_ALPHA(enc,c) Index: include/ruby/st.h

— include/ruby/st.h (revision 13544)  
+++ include/ruby/st.h (working copy)  
@@ -72,4 +72,6 @@ st\_table \*st\_init\_numtable\_with\_size(int  
st\_table \*st\_init\_strtable(void);  
st\_table \*st\_init\_strtable\_with\_size(int);  
+st\_table \*st\_init\_strcasetable(void);  
+st\_table \*st\_init\_strcasetable\_with\_size(int);  
int st\_delete(st\_table \*, st\_data\_t \*, st\_data\_t \*);  
int st\_delete\_safe(st\_table \*, st\_data\_t \*, st\_data\_t \*, st\_data\_t);

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [September 28, 2007, 12:33pm UTC](https://www.ruby-forum.com/t/m17n-string-encode/113923/4 "2007-09-28T12:33:34Z")

</div>

At 18:12 07/09/28, NARUSE, Yui wrote:

> e$B@.@%$G$9!#e(B
> 
> Yukihiro M. wrote:
> 
> > encodee$B$H$$$&L\>A0$OJQ49$r%$%a!\<%8$5$;$k$N$G$h$/$J$$$J$“$H;W$&e(B  
> > e$B$h$&$K$J$j$^$7$?!#$7$+$7!”$^!"L\>A0$O8e$GJQ$($k$3$H$K$7$F%3%\_%Ce(B  
> > e$B%H$7$F$/$@$5$$$^$;$s$+!)e(B
> 
> e$BJQ49$J$7$KJ8;z%3!\<%IL\>$r:9$7BX$($k$@$1$N\>l9g$Oe(B String#encoding= e$B$G!"e(B  
> e$BJQ49$rH\<$&\>l9g$Oe(B String#encode e$B$H$$$&$N$O$I$&$J$N$G$7$g$&!#e(B

e$B8@8l3XE\*$K$O6Z$,DL$k$H$3$m$,$"$j$^$9$,!"0lHL$N%f!\<%6!\<$K$O:.Mp$,e(B  
e$BM=A[$5$l$k!#e(B

> Shift\_JIS e$B$re(B  
> CP932 e$B$K:9$7BX$($k$H$+!"e(B

e$B$=$NFs$D$N0c$$$O6qBNE\*$K2?$G$7$g$&$+!#$?$@8e\<T$Ge(B MS e$BFCM-$Ne(B  
e$B30;z$,DI2C$5$l$?$i%P%$%HNs"\*J8;z%3!\<%ICe$-%P%$%HNs$HF1Ey$J$N$Oe(B  
e$B$9$4$/G\<F@$7$^$9!#e(B

e$B$7$+$7!"e(Biconv (e$B0lIte(B?) e$B$\_$?$$$K!"e(BShift\_JIS e$B$Ne(B  
0x5c e$B$r1\_5-9f!“e(B  
CP932 e$B$N\>l9g$K$O%P%C%/%9%i%C%7%e!”$H$$$&\>l9g$K$O$A$g$C$He(B  
e$B0c$&$N$G$O$J$$$+$H;W$$$^$9!#e(B

> e$B%P%$%HNs$KJ8;z%3!\<%I$r65$($k\>l9g$KJXMx$=$&$@$J$!$H!#e(B
> 
> # e$B8D?ME\*$K$Oe(B encode e$B$h$j$be(B convert e$B$NJ}$,$7$C$/$j$/$k$N$G$9$,e(B

e$BA4$/F10U$G$9!#e(B

e$B8D?ME\*$K$O;0\<oN`$N$b$N$,$"$k$+$H;W$$$^$9!#e(B  
1)  
e$B2r\<a$7$F$J$$$b$N$r2r\<a$9$k!#$3$l$O\>l$$$DNs$KJ8;z%3!\<%I$r65$($k!"e(B  
(e$B\>e5-$N\>r7o$Ge(B) Shift\_JIS e$B$+$ie(B CP932  
e$B$H$+$,9M$($i$l$F$$$k!#e(B  
e$B$3$l$Oe(B e$B!Ve(Binterpret\_ase$B!W$H$+e(B  
e$B!Ve(Base$B!W$\_$?$$$JL\>A0$,$$$$$N$G$O$J$$e(B  
e$B$+$H;W$$$^$9!#B?J,$3$3$O5U$N%1!\<%9$bF~$k$N$G$O$J$$$+$H;W$$$^$9!#e(B  
(String#interpret\_as(‘UNKNOWN-8BIT’) e$B$H$+e(B; “UNKNOWN-8BIT”  
e$B$K$D$$$F$Oe(B  
[Character Sets](http://www.iana.org/assignments/character-sets) e$B;2\>He(B)  
2)  
e$BJ8;z%3!\<%I$rL5M}LpM}JQ$($k$3$H!#$3$l$OIaDL$OM\>$j;H$o$J$$J}$,$$$$$N$G!"e(B  
e$BD9$$L\>A0$,$$$$$N$G$O$J$$$+$H;W$$$^$9!#Nc$($P!Ve(Bforce\_encodinge$B!W$H$+e(B  
e$B$N$h$&$J$b$N!#e(B  
e$B$3$3$^$G$NLdBj$O!"AjEv$N\>pJs$,$J$$$H$J$+$J$+e(B 1) e$B$He(B 2)  
e$B$r$h$/6hJL$G$-$J$$!#e(B

1. e$BJ8;z%3!\<%I\>pJs$r%Y!\<%9$K%3!\<%IJQ49$r9T$&!#$3$l$OB?J,e(B  
String#convert e$B$He(B String#convert!  
e$B$0$i$$$G$$$$$@$m$&$H;W$$$^$9!#e(B

e$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:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [September 28, 2007, 11:13am UTC](https://www.ruby-forum.com/t/m17n-string-encode/113923/5 "2007-09-28T11:13:52Z")

</div>

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

Yukihiro M. wrote:

> encodee$B$H$$$&L\>A0$OJQ49$r%$%a!\<%8$5$;$k$N$G$h$/$J$$$J$"$H;W$&e(B  
> e$B$h$&$K$J$j$^$7$?!#$7$+$7!"$^!"L\>A0$O8e$GJQ$($k$3$H$K$7$F%3%\_%Ce(B  
> e$B%H$7$F$/$@$5$$$^$;$s$+!)e(B

e$BJQ49$J$7$KJ8;z%3!\<%IL\>$r:9$7BX$($k$@$1$N\>l9g$Oe(B String#encoding=  
e$B$G!“e(B  
e$BJQ49$rH\<$&\>l9g$Oe(B String#encode  
e$B$H$$$&$N$O$I$&$J$N$G$7$g$&!#e(BShift\_JIS e$B$re(B  
CP932  
e$B$K:9$7BX$($k$H$+!”%P%$%HNs$KJ8;z%3!\<%I$r65$($k\>l9g$KJXMx$=$&$@$J$!$H!#e(B

# e$B8D?ME\*$K$Oe(B encode e$B$h$j$be(B convert

e$B$NJ}$,$7$C$/$j$/$k$N$G$9$,e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [September 28, 2007, 3:14pm UTC](https://www.ruby-forum.com/t/m17n-string-encode/113923/6 "2007-09-28T15:14:40Z")

</div>

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

Martin D. wrote:

> > Shift\_JIS e$B$re(B  
> > CP932 e$B$K:9$7BX$($k$H$+!"e(B
> 
> e$B$=$NFs$D$N0c$$$O6qBNE\*$K2?$G$7$g$&$+!#$?$@8e\<T$Ge(B MS e$BFCM-$Ne(B  
> e$B30;z$,DI2C$5$l$?$i%P%$%HNs"\*J8;z%3!\<%ICe$-%P%$%HNs$HF1Ey$J$N$Oe(B  
> e$B$9$4$/G\<F@$7$^$9!#e(B
> 
> e$B$7$+$7!"e(Biconv (e$B0lIte(B?) e$B$\_$?$$$K!"e(BShift\_JIS e$B$Ne(B 0x5c e$B$r1\_5-9f!“e(B  
> CP932 e$B$N\>l9g$K$O%P%C%/%9%i%C%7%e!”$H$$$&\>l9g$K$O$A$g$C$He(B  
> e$B0c$&$N$G$O$J$$$+$H;W$$$^$9!#e(B

e$B!VJ8;z%3!\<%I!W$H$$$&35G0$OB?5AE\*$J$b$N$G!“\<g$Ke(B  
1.valid e$B$J%P%$%HNs$NDj5Ae(B  
e$B!!e(B(/[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]/e$B$H$+!Ke(B  
2.e$B%3!\<%I%]%$%s%H$X$NJ8;z$N3d$jEv$F$NM-L5e(B  
3.Unicode e$B$H$NJQ49I=e(B  
4.e$BJ8;zNs!J%3!\<%I%]%$%s%HNs!&%P%$%HNs!K$N0UL#e(B  
e$B$H$$$C$?$b$N$,$”$k$H;W$$$^$9!#e(B

e$B$G!"e(BShift\_JIS e$B$He(B CP932 e$B$N0c$$$Oe(B 2, 3, 4  
e$B$J$N$G$9$,!“e(B  
e$B\<B:]$KLdBj$H$J$C$F$/$k$N$Oe(B 3 e$B$G$7$g$&!#e(B  
e$B$3$l$K$O!“0lIt%Y%s%@!\<$NFH\<+J8;z$r%^%C%W$9$k$+H]$+$b$”$k$N$G$9$,!“e(B  
e$B1\_5-9fLdBj$N$h$&$KJQ49I=$4$H$K%^%C%W$,0[$J$C$F$k\>l9g$b$”$j$^$9!#e(B  
e$B$J$\*!”$3$l$Oe(BShift\_JIS e$BEy$He(B Unicode  
e$B$N4V$NJQ49$N$\_$J$i$:!"e(B  
"\u00A5"e$B$r$$$+$K%P%$%HNs$KJQ49$9$k$+Ey$K$bMm$s$G$-$^$9!#e(B  
[http://www.w3.org/Submission/2005/SUBM-japanese-xml-20050324/](http://www.w3.org/Submission/2005/SUBM-japanese-xml-20050324/)

> e$B$3$3$^$G$NLdBj$O!"AjEv$N\>pJs$,$J$$$H$J$+$J$+e(B 1) e$B$He(B 2) e$B$r$h$/6hJL$G$-e(B  
> e$B$J$$!#e(B
> 
> 1. e$BJ8;z%3!\<%I\>pJs$r%Y!\<%9$K%3!\<%IJQ49$r9T$&!#$3$l$OB?J,e(B  
> String#convert e$B$He(B String#convert! e$B$0$i$$$G$$$$$@$m$&$H;W$$$^$9!#e(B

e$BB\>$N8@8l$J$i$P$=$N$h$&$Ke(B3e$B$D$N%a%=%C%I$KJ,$1$k$H;W$&$N$G$9$,!“e(B  
Ruby  
e$B$O;w$?5!G=$O0l$D$N%a%=%C%Ie(B/e$B%/%i%9$K$^$H$a$k$H$$$&798~$,$”$k$N$G!“e(B  
String#encode e$B$K8=:\_$^$H$a$F$”$k$N$@$H;W$C$F$$$^$9!#e(B

e$B$1$l$I$b!“JQ49$7$F$$$J$$$N$KJQ49$r0UL#$9$k8l$rMQ$$$F$$$k$N$O%”%l$J$N$Ge(B

1. 
  1. e$B$rJL$K$7$h$&$H$$$&OC$J$N$G$9$h$M!#e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [September 28, 2007, 9:31pm UTC](https://www.ruby-forum.com/t/m17n-string-encode/113923/7 "2007-09-28T21:31:59Z")

</div>

e$B$J$+$@$G$9!#e(B

At Fri, 28 Sep 2007 22:13:54 +0900,  
NARUSE, Yui wrote in [ruby-dev:31897]:

> Martin D. wrote:
> 
> > e$B8D?ME\*$K$O;0\<oN`$N$b$N$,$"$k$+$H;W$$$^$9!#e(B
> > 
> > 1. e$B2r\<a$7$F$J$$$b$N$r2r\<a$9$k!#$3$l$O\>l$$$DNs$KJ8;z%3!\<%I$r65$($k!"e(B  
> > (e$B\>e5-$N\>r7o$Ge(B) Shift\_JIS e$B$+$ie(B CP932 e$B$H$+$,9M$($i$l$F$$$k!#e(B  
> > e$B$3$l$Oe(B e$B!Ve(Binterpret\_ase$B!W$H$+e(B e$B!Ve(Base$B!W$\_$?$$$JL\>A0$,$$$$$N$G$O$J$$e(B  
> > e$B$+$H;W$$$^$9!#B?J,$3$3$O5U$N%1!\<%9$bF~$k$N$G$O$J$$$+$H;W$$$^$9!#e(B  
> > (String#interpret\_as(‘UNKNOWN-8BIT’) e$B$H$+e(B; “UNKNOWN-8BIT” e$B$K$D$$$F$Oe(B  
> > [Character Sets](http://www.iana.org/assignments/character-sets) e$B;2\>He(B)

e$B8=:\_e(B"US-ASCII"e$B$He(B"UNKNOWN-8BIT"e$B$O$H$/$K6hJL$7$F$$$^$;$s$,!“e(B  
“UNKNOWN"e$B$de(B"BINARY"e$B!”$”$k$$$Oe(B1.8e$B$Ne(BKCODEe$B$N$h$&$Je(B"NONE"e$B$rJ,$1$F!"e(B  
“UNKNOWN”\<-\>e$B$=$NB\>$Ne(Bencodinge$B$@$1$r5v$7$F$=$l0J30$O%(%i!\<$K$9$k!"e(B  
e$B$H$$$&$h$&$Ke(B1)e$B$rFs$D$KJ,$1$k$H$$$&$3$H$b9M$($i$l$k$H;W$$$^$9!#e(B

binay\_string.encode(encoding\_name) #=\> encoded\_string  
encoded\_string.decode #=\> binay\_string

> > 1. e$BJ8;z%3!\<%I$rL5M}LpM}JQ$($k$3$H!#$3$l$OIaDL$OM\>$j;H$o$J$$J}$,$$$$$N$G!"e(B  
> > e$BD9$$L\>A0$,$$$$$N$G$O$J$$$+$H;W$$$^$9!#Nc$($P!Ve(Bforce\_encodinge$B!W$H$+e(B  
> > e$B$N$h$&$J$b$N!#e(B  
> > e$B$3$3$^$G$NLdBj$O!"AjEv$N\>pJs$,$J$$$H$J$+$J$+e(B 1) e$B$He(B 2) e$B$r$h$/6hJL$G$-$J$$!#e(B

e$B\>e5-$NJ}K!$G$“$l$P!”$3$l$Oe(B str.decode.encode(new\_encoding)  
e$B$H=qe(B  
e$B$/$3$H$K$J$j!"6hJL$5$;$k$3$H$O$G$-$k$N$G$O$J$$$G$7$g$&$+!#e(B

> > 1. e$BJ8;z%3!\<%I\>pJs$r%Y!\<%9$K%3!\<%IJQ49$r9T$&!#$3$l$OB?J,e(B  
> > String#convert e$B$He(B String#convert! e$B$0$i$$$G$$$$$@$m$&$H;W$$$^$9!#e(B
> 
> e$BB\>$N8@8l$J$i$P$=$N$h$&$Ke(B3e$B$D$N%a%=%C%I$KJ,$1$k$H;W$&$N$G$9$,!“e(B  
> Ruby e$B$O;w$?5!G=$O0l$D$N%a%=%C%Ie(B/e$B%/%i%9$K$^$H$a$k$H$$$&798~$,$”$k$N$G!“e(B  
> String#encode e$B$K8=:\_$^$H$a$F$”$k$N$@$H;W$C$F$$$^$9!#e(B
> 
> e$B$1$l$I$b!“JQ49$7$F$$$J$$$N$KJQ49$r0UL#$9$k8l$rMQ$$$F$$$k$N$O%”%l$J$N$Ge(B
> 
> 1. 
> 1. e$B$rJL$K$7$h$&$H$$$&OC$J$N$G$9$h$M!#e(B

3)e$B$+$iJL$K$9$k!"$H$$$&0UL#$G$9$h$M!#JQ49$K$D$$$F$O$^$?JLESDI2C$9e(B  
e$B$k$3$H$K$7$^$7$g$&!#e(B

e$BL\>A0$K$D$$$F$O!"$R$H$^$:e(BMartine$B$5$s$Ne(Bforce\_encodinge$B$r;H$o$;$F$b$ie(B  
e$B$$$^$7$?!#e(B
