[前][次][番号順一覧][スレッド一覧]

ruby-changes:10487

From: akr <ko1@a...>
Date: Wed, 4 Feb 2009 22:03:58 +0900 (JST)
Subject: [ruby-changes:10487] Ruby:r22039 (trunk): * transcode.c (make_econv_exception): show U+XXXX form for undefined

akr	2009-02-04 22:01:12 +0900 (Wed, 04 Feb 2009)

  New Revision: 22039

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22039

  Log:
    * transcode.c (make_econv_exception): show U+XXXX form for undefined
      conversion error from UTF-8.

  Modified files:
    trunk/ChangeLog
    trunk/transcode.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 22038)
+++ ChangeLog	(revision 22039)
@@ -1,3 +1,8 @@
+Wed Feb  4 21:59:31 2009  Tanaka Akira  <akr@f...>
+
+	* transcode.c (make_econv_exception): show U+XXXX form for undefined
+	  conversion error from UTF-8.
+
 Wed Feb  4 21:57:37 2009  Tanaka Akira  <akr@f...>
 
 	* string.c (rb_str_dump): use MBCLEN_CHARFOUND_P properly.
Index: transcode.c
===================================================================
--- transcode.c	(revision 22038)
+++ transcode.c	(revision 22039)
@@ -2009,9 +2009,23 @@
     if (ec->last_error.result == econv_undefined_conversion) {
         VALUE bytes = rb_str_new((const char *)ec->last_error.error_bytes_start,
                                  ec->last_error.error_bytes_len);
-        VALUE dumped;
+        VALUE dumped = Qnil;
         int idx;
-        dumped = rb_str_dump(bytes);
+        if (strcmp(ec->last_error.source_encoding, "UTF-8") == 0) {
+            rb_encoding *utf8 = rb_utf8_encoding();
+            const char *start, *end;
+            int n;
+            start = (const char *)ec->last_error.error_bytes_start;
+            end = start + ec->last_error.error_bytes_len;
+            n = rb_enc_precise_mbclen(start, end, utf8);
+            if (MBCLEN_CHARFOUND_P(n) &&
+                MBCLEN_CHARFOUND_LEN(n) == ec->last_error.error_bytes_len) {
+                unsigned int cc = rb_enc_codepoint(start, end, utf8);
+                dumped = rb_sprintf("U+%04X", cc);
+            }
+        }
+        if (dumped == Qnil)
+            dumped = rb_str_dump(bytes);
         mesg = rb_sprintf("%s from %s to %s",
                 StringValueCStr(dumped),
                 ec->last_error.source_encoding,

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]