diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-11 08:43:31 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-11 08:43:31 +0000 |
commit | c1b24588d378ae1d976ebd1521f2d9083214f9e7 (patch) | |
tree | 08aab22c6a07becdf4729d42086acc8f77adc22d /error.c | |
parent | 44691b901e4d93debf64af33d4349662553e61e5 (diff) | |
download | ruby-c1b24588d378ae1d976ebd1521f2d9083214f9e7.tar.gz |
* error.c (syserr_initialize): use mesg's encoding when locale
encoding is US-ASCII. If locale encoding is not US-ASCII,
assume err has non ASCII characters. [ruby-dev:42358]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'error.c')
-rw-r--r-- | error.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -1048,16 +1048,23 @@ syserr_initialize(int argc, VALUE *argv, VALUE self) if (!NIL_P(error)) err = strerror(NUM2INT(error)); else err = "unknown error"; if (!NIL_P(mesg)) { + rb_encoding *le = rb_locale_encoding(); VALUE str = mesg; StringValue(str); mesg = rb_sprintf("%s - %.*s", err, (int)RSTRING_LEN(str), RSTRING_PTR(str)); + if (le == rb_usascii_encoding()) { + rb_encoding *me = rb_enc_get(mesg); + if (le != me && rb_enc_asciicompat(me)) + le = me; + }/* else assume err is non ASCII string. */ + rb_enc_associate(mesg, le); } else { mesg = rb_str_new2(err); + rb_enc_associate(mesg, rb_locale_encoding()); } - rb_enc_associate(mesg, rb_locale_encoding()); rb_call_super(1, &mesg); rb_iv_set(self, "errno", error); return self; |