/*** * 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); }