コード例 #1
0
        /***
         * MUST represent all strings (including object member names) in their minimal-length UTF-8 encoding
         * avoiding escape sequences for characters except those otherwise inexpressible in JSON (U+0022 QUOTATION MARK, U+005C REVERSE SOLIDUS, and ASCII control characters U+0000 through U+001F) or UTF-8 (U+D800 through U+DFFF), and
         * avoiding escape sequences for combining characters, variation selectors, and other code points that affect preceding characters, and
         * using two-character escape sequences where possible for characters that require escaping:
         * \b U+0008 BACKSPACE
         * \t U+0009 CHARACTER TABULATION ("tab")
         * \n U+000A LINE FEED ("newline")
         * \f U+000C FORM FEED
         * \r U+000D CARRIAGE RETURN
         * \" U+0022 QUOTATION MARK
         * \\ U+005C REVERSE SOLIDUS ("backslash"), and
         * using six-character \\u00xx uppercase hexadecimal escape sequences for control characters that require escaping but lack a two-character sequence, and
         * using six-character \\uDxxx uppercase hexadecimal escape sequences for lone surrogates
         * @param value
         */
        private void SerializeString(string value)
        {
            buffer.append(Constants.C_DOUBLE_QUOTE);
            if (FORBIDDEN.Matches(value).Count == 0)
            {
                buffer.append(value);
            }
            else
            {
                char[] chars = value.ToCharArray();
                for (int i = 0; i < chars.Length; i++)
                {
                    char c = chars[i];
                    {
                        if (FORBIDDEN.Matches(Convert.ToString(c)).Count == 0)
                        {
                            buffer.append(c);
                            continue;
                        }
                        if (java.lang.Character.isSurrogate(chars[i]) && chars.Length > i + 1 && java.lang.Character.isSurrogatePair(chars[i], chars[i + 1]))
                        {
                            buffer.appendCodePoint(CharHelper.ToCodePoint(chars[i], chars[++i]));
                            continue;
                        }
                        switch (c)
                        {
                        case Constants.C_LINE_FEED:
                            Escape('n');
                            break;

                        case Constants.C_BACKSPACE:
                            Escape('b');
                            break;

                        case Constants.C_FORM_FEED:
                            Escape('f');
                            break;

                        case Constants.C_CARRIAGE_RETURN:
                            Escape('r');
                            break;

                        case Constants.C_TAB:
                            Escape('t');
                            break;

                        case Constants.C_DOUBLE_QUOTE:
                        case Constants.C_BACK_SLASH:
                            Escape(c);
                            break;

                        default:

                            Escape('u');
                            string hex = string.Format("{0:x4}", (int)c).ToUpper();
                            buffer.append(hex);
                            break;
                        }
                    }
                }
            }
            buffer.append(Constants.C_DOUBLE_QUOTE);
        }