return v, true;
 }
 
+func _ToHex(b []byte, rune int) {
+       const hexDigits = "0123456789abcdef";
+       b[0] = hexDigits[rune>>12&0xf];
+       b[1] = hexDigits[rune>>8&0xf];
+       b[2] = hexDigits[rune>>4&0xf];
+       b[3] = hexDigits[rune&0xf];
+}
+
 // Unquote unquotes the JSON-quoted string s,
 // returning a raw string t.  If s is not a valid
 // JSON-quoted string, Unquote returns with ok set to false.
                                w++;
                        case 'u':
                                r++;
-                               rune, ok := _UnHex(s, r, 4);
+                               rune, ok := _UnHex(s, r, r+4);
                                if !ok {
                                        return
                                }
 // Quote quotes the raw string s using JSON syntax,
 // so that Unquote(Quote(s)) = s, true.
 func Quote(s string) string {
-       chr := make([]byte, utf8.UTFMax);
+       chr := make([]byte, 6);
        chr0 := chr[0:1];
        b := new(bytes.Buffer);
        chr[0] = '"';
        b.Write(chr0);
-       for i := 0; i < len(s); i++ {
+
+       for _, rune := range s {
                switch {
-               case s[i] == '"' || s[i] == '\\':
+               case rune == '"' || rune == '\\':
                        chr[0] = '\\';
-                       chr[1] = s[i];
+                       chr[1] = byte(rune);
                        b.Write(chr[0:2]);
 
-               case s[i] == '\b':
+               case rune == '\b':
                        chr[0] = '\\';
                        chr[1] = 'b';
                        b.Write(chr[0:2]);
 
-               case s[i] == '\f':
+               case rune == '\f':
                        chr[0] = '\\';
                        chr[1] = 'f';
                        b.Write(chr[0:2]);
 
-               case s[i] == '\n':
+               case rune == '\n':
                        chr[0] = '\\';
                        chr[1] = 'n';
                        b.Write(chr[0:2]);
 
-               case s[i] == '\r':
+               case rune == '\r':
                        chr[0] = '\\';
                        chr[1] = 'r';
                        b.Write(chr[0:2]);
 
-               case s[i] == '\t':
+               case rune == '\t':
                        chr[0] = '\\';
                        chr[1] = 't';
                        b.Write(chr[0:2]);
 
-               case 0x20 <= s[i] && s[i] < utf8.RuneSelf:
-                       chr[0] = s[i];
+               case 0x20 <= rune && rune < utf8.RuneSelf:
+                       chr[0] = byte(rune);
                        b.Write(chr0);
+
+               default:
+                       chr[0] = '\\';
+                       chr[1] = 'u';
+                       _ToHex(chr[2:6], rune);
+                       b.Write(chr);
                }
        }
        chr[0] = '"';