summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--error.c9
2 files changed, 14 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 6acde0d7ed..9d6fca280c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon Oct 11 17:42:54 2010 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * 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]
+
Mon Oct 11 14:03:54 2010 NARUSE, Yui <naruse@ruby-lang.org>
* error.c (syserr_initialize): set the encoding of Errno::*#message
diff --git a/error.c b/error.c
index f05600f7fb..94126f709b 100644
--- a/error.c
+++ b/error.c
@@ -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;