[#32945] Shift_JIS variants and UTF-16 support — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

22 messages 2008/01/07
[#32953] Re: Shift_JIS variants and UTF-16 support — Martin Duerst <duerst@...> 2008/01/07

中村さん、こんにちは。

[#32955] Re: Shift_JIS variants and UTF-16 support — Yukihiro Matsumoto <matz@...> 2008/01/07

まつもと ゆきひろです

[#32959] Re: Shift_JIS variants and UTF-16 support — "NARUSE, Yui" <naruse@...> 2008/01/07

成瀬です。

[#32960] Re: Shift_JIS variants and UTF-16 support — Yukihiro Matsumoto <matz@...> 2008/01/07

まつもと ゆきひろです

[#32992] ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...>

成瀬です。

18 messages 2008/01/08
[#32994] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Yukihiro Matsumoto <matz@...> 2008/01/09

まつもと ゆきひろです

[#32995] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Martin Duerst <duerst@...> 2008/01/09

At 18:13 08/01/09, Yukihiro Matsumoto wrote:

[#33011] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...> 2008/01/11

成瀬です。

[#33012] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Yukihiro Matsumoto <matz@...> 2008/01/11

まつもと ゆきひろです

[#33014] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — "NARUSE, Yui" <naruse@...> 2008/01/11

成瀬です。

[#33015] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy — Yukihiro Matsumoto <matz@...> 2008/01/11

まつもと ゆきひろです

[#33239] Re: [ruby-cvs:22386] Ruby:r15149 (trunk): * string.c (rb_str_each_char): move forward. — Tanaka Akira <akr@...>

In article <200801210259.m0L2x3CW017171@ci.ruby-lang.org>,

11 messages 2008/01/21
[#33240] Re: [ruby-cvs:22386] Ruby:r15149 (trunk): * string.c (rb_str_each_char): move forward. — Nobuyoshi Nakada <nobu@...> 2008/01/21

なかだです。

[#33303] Time#strftimeのエンコーディング — rubikitch@...

るびきちです。

13 messages 2008/01/23
[#33305] Re: Time#strftimeのエンコーディング — Yukihiro Matsumoto <matz@...> 2008/01/23

まつもと ゆきひろです

[#33368] summary of script encoding — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

22 messages 2008/01/25
[#33375] Re: summary of script encoding — Yukihiro Matsumoto <matz@...> 2008/01/25

まつもと ゆきひろです

[#33376] Re: summary of script encoding — "U.Nakamura" <usa@...> 2008/01/25

こんにちは、なかむら(う)です。

[#33387] HashからStructを作る — rubikitch@...

るびきちです。

19 messages 2008/01/25
[#33455] Re: HashからStructを作る — Yukihiro Matsumoto <matz@...> 2008/01/28

まつもと ゆきひろです

[#33505] Re: HashからStructを作る — rubikitch@... 2008/01/29

From: Yukihiro Matsumoto <matz@ruby-lang.org>

[#33507] Re: HashからStructを作る — Yukihiro Matsumoto <matz@...> 2008/01/29

まつもと ゆきひろです

[#33508] Re: HashからStructを作る — rubikitch@... 2008/01/29

From: Yukihiro Matsumoto <matz@ruby-lang.org>

[#33433] Win32OLE: set encoding to OLE string — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

16 messages 2008/01/28

[#33461] Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...>

=1B$B?9ED$H?=3D$7$^$9!#=1B(B

19 messages 2008/01/28
[#33473] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Nobuyoshi Nakada <nobu@...> 2008/01/28

なかだです。

[#33503] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/29

森田です。

[#33514] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Nobuyoshi Nakada <nobu@...> 2008/01/29

なかだです。

[#33518] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/30

森田です。

[#33545] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Ryutaro Amano <wn9r-amn@...> 2008/01/31

天野竜太郎と申します。

[#33546] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/31

森田です。

[#33547] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — Ryutaro Amano <wn9r-amn@...> 2008/01/31

天野です。

[#33551] Re: Failed to make ruby-1.8.6-p111 on MacOSX 10.5(Leopard) — MORITA Hideyuki <h-morita@...> 2008/01/31

森田です。

[#33488] 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

20 messages 2008/01/29
[#33491] Re: 現在の script encoding の値を得る方法は? — Yukihiro Matsumoto <matz@...> 2008/01/29

まつもと ゆきひろです

[#33500] Re: 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...> 2008/01/29

永井@知能.九工大です.

[#33501] Re: 現在の script encoding の値を得る方法は? — "NARUSE, Yui" <naruse@...> 2008/01/29

成瀬です。

[#33515] Re: 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...> 2008/01/30

永井@知能.九工大です.

[#33516] Re: 現在の script encoding の値を得る方法は? — "NARUSE, Yui" <naruse@...> 2008/01/30

成瀬です。

[#33519] Re: 現在の script encoding の値を得る方法は? — Hidetoshi NAGAI <nagai@...> 2008/01/30

永井@知能.九工大です.

[#33522] Re: 現在の script encoding の値を得る方法は? — "NARUSE, Yui" <naruse@...> 2008/01/30

成瀬です。

[ruby-dev:33550] String#inspect may raise Exception

From: "NARUSE, Yui" <naruse@...>
Date: 2008-01-31 09:54:59 UTC
List: ruby-dev #33550
成瀬です。

> ["\x82\xa0".force_encoding("sjis"),
   "\xa4\xa2".force_encoding("euc-jp"),
   "\xe3\x81\x82".force_encoding("utf-8")].inspect
ArgumentError: append incompatible encoding strings: Shift_JIS and EUC-JP

となります。

思うに、現在 String#inspect は自分自身の encoding と中身のバイト列を比較
して valid ならばエスケープしないという処理を行っていますが、自分自身の
encoding でなく、結果となる文字列の encoding を基準とする必要があると思
われます。

つまるところ、inspect が引数に encoding を取る必要があるのですが、
inspect は再帰的に呼ばれるため、ユーザーオブジェクトでも inspect(enc) が
定義されている必要があり、結果的にこのアプローチは事実上不可能です。

新仕様対応の inspect がスレッドローカル変数に期待する encoding をセット
するという技もなきにしもあらずですが、現在のマルチバイト文字列をエスケー
プなしに出力するという仕様をあきらめざるをえないように感じます。

なお、String#inspect に限って、引数として encoding を取る、というのなら
ば、それはいまだ可能ではあります。

--- string.c    (revision 15383)
+++ string.c    (local)
@@ -3259,23 +3259,6 @@
     return str;
 }

-static void
-str_cat_char(VALUE str, int c, rb_encoding *enc)
-{
-    char s[16];
-    int n = rb_enc_codelen(c, enc);
-
-    rb_enc_mbcput(c, s, enc);
-    rb_enc_str_buf_cat(str, s, n, enc);
-}
-
-static void
-prefix_escape(VALUE str, int c, rb_encoding *enc)
-{
-    str_cat_char(str, '\\', enc);
-    str_cat_char(str, c, enc);
-}
-
 /*
  * call-seq:
  *   str.inspect   => string
@@ -3291,81 +3274,65 @@
 VALUE
 rb_str_inspect(VALUE str)
 {
-    rb_encoding *enc = STR_ENC_GET(str);
     char *p, *pend;
-    VALUE result = rb_str_buf_new2("");
+    VALUE result = rb_str_buf_new2("\"");

-    rb_enc_associate(result, enc);
-    str_cat_char(result, '"', enc);
+    ENCODING_CODERANGE_SET(result, rb_usascii_encindex(),
ENC_CODERANGE_7BIT);
     p = RSTRING_PTR(str); pend = RSTRING_END(str);
     while (p < pend) {
-       int c;
-       int n;
+       int c = *p++;
        int cc;

-        n = rb_enc_precise_mbclen(p, pend, enc);
-        if (!MBCLEN_CHARFOUND_P(n)) {
-            p++;
-            n = 1;
-            goto escape_codepoint;
-        }
-        n = MBCLEN_CHARFOUND_LEN(n);
-
-       c = rb_enc_codepoint(p, pend, enc);
-       n = rb_enc_codelen(c, enc);
-
-       p += n;
-       if (c == '"'|| c == '\\' ||
-           (c == '#' &&
+       if (c == '#' &&
              p < pend &&
-             MBCLEN_CHARFOUND_P(rb_enc_precise_mbclen(p,pend,enc)) &&
-             (cc = rb_enc_codepoint(p,pend,enc),
-              (cc == '$' || cc == '@' || cc == '{')))) {
-           prefix_escape(result, c, enc);
+             (cc = *(p),
+              (cc == '$' || cc == '@' || cc == '{'))) {
+           rb_str_buf_cat2(result, "\\#");
        }
+        else if (c == '"') {
+           rb_str_buf_cat2(result, "\\\"");
+        }
+        else if (c == '\\') {
+           rb_str_buf_cat2(result, "\\\\");
+        }
        else if (c == '\n') {
-           prefix_escape(result, 'n', enc);
+           rb_str_buf_cat2(result, "\\n");
        }
        else if (c == '\r') {
-           prefix_escape(result, 'r', enc);
+           rb_str_buf_cat2(result, "\\r");
        }
        else if (c == '\t') {
-           prefix_escape(result, 't', enc);
+           rb_str_buf_cat2(result, "\\t");
        }
        else if (c == '\f') {
-           prefix_escape(result, 'f', enc);
+           rb_str_buf_cat2(result, "\\f");
        }
        else if (c == '\013') {
-           prefix_escape(result, 'v', enc);
+           rb_str_buf_cat2(result, "\\v");
        }
        else if (c == '\010') {
-           prefix_escape(result, 'b', enc);
+           rb_str_buf_cat2(result, "\\b");
        }
        else if (c == '\007') {
-           prefix_escape(result, 'a', enc);
+           rb_str_buf_cat2(result, "\\a");
        }
        else if (c == 033) {
-           prefix_escape(result, 'e', enc);
+           rb_str_buf_cat2(result, "\\e");
        }
-       else if (rb_enc_isprint(c, enc)) {
-           rb_enc_str_buf_cat(result, p-n, n, enc);
-       }
        else {
            char buf[5];
            char *s;
             char *q;

          escape_codepoint:
-            for (q = p-n; q < p; q++) {
+            for (q = p-1; q < p; q++) {
                 s = buf;
                 sprintf(buf, "\\x%02X", *q & 0377);
-                while (*s) {
-                    str_cat_char(result, *s++, enc);
-                }
+                rb_str_buf_cat2(result, s);
             }
        }
     }
-    str_cat_char(result, '"', enc);
+    rb_str_buf_cat2(result, "\"");

     OBJ_INFECT(result, str);
     return result;


-- 
NARUSE, Yui  <naruse@airemix.com>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA

In This Thread

Prev Next