From: "Iñaki Baz Castillo" Date: 2009-12-03T07:01:14+09:00 Subject: Re: How to use rb_enc_str_new() to create a String with UTF-8 encoding? El Miércoles, 2 de Diciembre de 2009, Brian Candler escribió: > Iñaki Baz Castillo wrote: > > El Miércoles, 2 de Diciembre de 2009, Brian Candler escribió: > >> > How should I fill the third 'enc' argument? > >> > >> return rb_enc_from_index(idx); > >> } > > > > Humm, it involves allocating memory for the rb_encoding object > > Why? AFAICS, you can just pass a pointer to an existing encoding object. > They are not mutated. > > There are other examples, e.g. from io.c > > #ifdef _WIN32 > if (utf16 == (rb_encoding *)-1) { > utf16 = rb_enc_find("UTF-16LE"); > if (utf16 == rb_ascii8bit_encoding()) > utf16 = NULL; > } > if (utf16) { > VALUE wfname = rb_str_encode(fname, rb_enc_from_encoding(utf16), > 0, > Qnil); > rb_enc_str_buf_cat(wfname, "", 1, utf16); /* workaround */ > data.fname = RSTRING_PTR(wfname); > data.wchar = 1; > } > else { > data.wchar = 0; > } > #endif > > It looks like rb_enc_from_encoding() takes a pointer to the rb_encoding > object returned from rb_enc_find, and turns it into a VALUE Ok, so the rb_encoding objects already exist and I just must use a point to it. Thanks a lot. -- Iñaki Baz Castillo