diff --git a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java index fd9d10795..e0a47e996 100644 --- a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java @@ -457,53 +457,50 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { } for (int i = 0; i < len; i++) { char ch = value.charAt(i); - switch (ch) { - case '\n': - bytes[curr++] = '\\'; - bytes[curr++] = 'n'; - break; - case '\r': - bytes[curr++] = '\\'; - bytes[curr++] = 'r'; - break; - case '\f': - bytes[curr++] = '\\'; - bytes[curr++] = 'f'; - break; - case '\b': - bytes[curr++] = '\\'; - bytes[curr++] = 'b'; - break; - case '\t': - bytes[curr++] = '\\'; - bytes[curr++] = 't'; - break; - case '\\': - bytes[curr++] = '\\'; - bytes[curr++] = '\\'; - break; - case BYTE_DQUOTE: - bytes[curr++] = '\\'; - bytes[curr++] = BYTE_DQUOTE; - break; - default: - if (ch < 0x80) { + if (ch < 14) { + switch (ch) { + case '\n': // 10 + bytes[curr++] = '\\'; + bytes[curr++] = 'n'; + break; + case '\r': // 13 + bytes[curr++] = '\\'; + bytes[curr++] = 'r'; + break; + case '\t': // 8 + bytes[curr++] = '\\'; + bytes[curr++] = 't'; + break; + case '\f': // 12 + bytes[curr++] = '\\'; + bytes[curr++] = 'f'; + break; + case '\b': // 9 + bytes[curr++] = '\\'; + bytes[curr++] = 'b'; + break; + default: bytes[curr++] = (byte) ch; - } else if (ch < 0x800) { - bytes[curr++] = (byte) (0xc0 | (ch >> 6)); - bytes[curr++] = (byte) (0x80 | (ch & 0x3f)); - } else if (Character.isSurrogate(ch)) { // 连取两个 - int uc = Character.toCodePoint(ch, value.charAt(++i)); - bytes[curr++] = (byte) (0xf0 | (uc >> 18)); - bytes[curr++] = (byte) (0x80 | ((uc >> 12) & 0x3f)); - bytes[curr++] = (byte) (0x80 | ((uc >> 6) & 0x3f)); - bytes[curr++] = (byte) (0x80 | (uc & 0x3f)); - } else { - bytes[curr++] = (byte) (0xe0 | (ch >> 12)); - bytes[curr++] = (byte) (0x80 | ((ch >> 6) & 0x3f)); - bytes[curr++] = (byte) (0x80 | (ch & 0x3f)); - } - break; + break; + } + } else if (ch == '"' || ch == '\\') { + bytes[curr++] = '\\'; + bytes[curr++] = (byte) ch; + } else if (ch < 0x80) { + bytes[curr++] = (byte) ch; + } else if (ch < 0x800) { + bytes[curr++] = (byte) (0xc0 | (ch >> 6)); + bytes[curr++] = (byte) (0x80 | (ch & 0x3f)); + } else if (Character.isSurrogate(ch)) { // 连取两个 + int uc = Character.toCodePoint(ch, value.charAt(++i)); + bytes[curr++] = (byte) (0xf0 | (uc >> 18)); + bytes[curr++] = (byte) (0x80 | ((uc >> 12) & 0x3f)); + bytes[curr++] = (byte) (0x80 | ((uc >> 6) & 0x3f)); + bytes[curr++] = (byte) (0x80 | (uc & 0x3f)); + } else { + bytes[curr++] = (byte) (0xe0 | (ch >> 12)); + bytes[curr++] = (byte) (0x80 | ((ch >> 6) & 0x3f)); + bytes[curr++] = (byte) (0x80 | (ch & 0x3f)); } } if (quote) { diff --git a/src/main/java/org/redkale/convert/json/JsonCharsWriter.java b/src/main/java/org/redkale/convert/json/JsonCharsWriter.java index ecd6d9fdc..e9b15bdda 100644 --- a/src/main/java/org/redkale/convert/json/JsonCharsWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonCharsWriter.java @@ -388,38 +388,37 @@ public class JsonCharsWriter extends JsonWriter { } for (int i = 0; i < len; i++) { char ch = str.charAt(i); - switch (ch) { - case '\n': - chars[curr++] = '\\'; - chars[curr++] = 'n'; - break; - case '\r': - chars[curr++] = '\\'; - chars[curr++] = 'r'; - break; - case '\f': - chars[curr++] = '\\'; - chars[curr++] = 'f'; - break; - case '\b': - chars[curr++] = '\\'; - chars[curr++] = 'b'; - break; - case '\t': - chars[curr++] = '\\'; - chars[curr++] = 't'; - break; - case '\\': - chars[curr++] = '\\'; - chars[curr++] = ch; - break; - case '"': - chars[curr++] = '\\'; - chars[curr++] = ch; - break; - default: - chars[curr++] = ch; - break; + if (ch < 14) { + switch (ch) { + case '\n': // 10 + chars[curr++] = '\\'; + chars[curr++] = 'n'; + break; + case '\r': // 13 + chars[curr++] = '\\'; + chars[curr++] = 'r'; + break; + case '\t': // 8 + chars[curr++] = '\\'; + chars[curr++] = 't'; + break; + case '\f': // 12 + chars[curr++] = '\\'; + chars[curr++] = 'f'; + break; + case '\b': // 9 + chars[curr++] = '\\'; + chars[curr++] = 'b'; + break; + default: + chars[curr++] = ch; + break; + } + } else if (ch == '"' || ch == '\\') { + chars[curr++] = '\\'; + chars[curr++] = ch; + } else { + chars[curr++] = ch; } } if (quote) { @@ -441,38 +440,37 @@ public class JsonCharsWriter extends JsonWriter { b1 = bytes[i]; b2 = bytes[i + 1]; char ch = (char) ((b2 == 0 && b1 >= 0) ? b1 : ((b1 & 0xff) | ((b2 & 0xff) << 8))); - switch (ch) { - case '\n': - chars[curr++] = '\\'; - chars[curr++] = 'n'; - break; - case '\r': - chars[curr++] = '\\'; - chars[curr++] = 'r'; - break; - case '\f': - chars[curr++] = '\\'; - chars[curr++] = 'f'; - break; - case '\b': - chars[curr++] = '\\'; - chars[curr++] = 'b'; - break; - case '\t': - chars[curr++] = '\\'; - chars[curr++] = 't'; - break; - case '\\': - chars[curr++] = '\\'; - chars[curr++] = ch; - break; - case '"': - chars[curr++] = '\\'; - chars[curr++] = ch; - break; - default: - chars[curr++] = ch; - break; + if (ch < 14) { + switch (ch) { + case '\n': // 10 + chars[curr++] = '\\'; + chars[curr++] = 'n'; + break; + case '\r': // 13 + chars[curr++] = '\\'; + chars[curr++] = 'r'; + break; + case '\t': // 8 + chars[curr++] = '\\'; + chars[curr++] = 't'; + break; + case '\f': // 12 + chars[curr++] = '\\'; + chars[curr++] = 'f'; + break; + case '\b': // 9 + chars[curr++] = '\\'; + chars[curr++] = 'b'; + break; + default: + chars[curr++] = ch; + break; + } + } else if (ch == '"' || ch == '\\') { + chars[curr++] = '\\'; + chars[curr++] = ch; + } else { + chars[curr++] = ch; } } if (quote) { @@ -494,22 +492,22 @@ public class JsonCharsWriter extends JsonWriter { } else if (b == '\\') { chars[curr++] = '\\'; chars[curr++] = '\\'; - } else if (b < 32) { - if (b == '\n') { + } else if (b < 14) { + if (b == '\n') { // 10 chars[curr++] = '\\'; chars[curr++] = 'n'; - } else if (b == '\r') { + } else if (b == '\r') { // 13 chars[curr++] = '\\'; chars[curr++] = 'r'; - } else if (b == '\f') { - chars[curr++] = '\\'; - chars[curr++] = 'f'; - } else if (b == '\b') { - chars[curr++] = '\\'; - chars[curr++] = 'b'; - } else if (b == '\t') { + } else if (b == '\t') { // 8 chars[curr++] = '\\'; chars[curr++] = 't'; + } else if (b == '\f') { // 12 + chars[curr++] = '\\'; + chars[curr++] = 'f'; + } else if (b == '\b') { // 9 + chars[curr++] = '\\'; + chars[curr++] = 'b'; } else { chars[curr++] = (char) b; }