| 1291 | } |
| 1292 | |
| 1293 | private void write8(final @NotNull String str) { |
| 1294 | for (int i = 0, n = str.length(), d; i < n; i++) { |
| 1295 | int c = str.charAt(i); |
| 1296 | if (c < 0x80) { |
| 1297 | byte b = ESCAPE[c]; |
| 1298 | if (b == 0) |
| 1299 | buf[pos++] = (byte)c; // 0xxx xxxx |
| 1300 | else { |
| 1301 | buf[pos++] = '\\'; |
| 1302 | buf[pos++] = b; |
| 1303 | if (b == 'u') { |
| 1304 | buf[pos++] = '0'; |
| 1305 | buf[pos++] = '0'; |
| 1306 | buf[pos++] = (byte)('0' + (c >> 4)); |
| 1307 | buf[pos++] = (byte)num2Hex(c & 0xf); |
| 1308 | } |
| 1309 | } |
| 1310 | } else { |
| 1311 | if (c < 0x800) |
| 1312 | buf[pos++] = (byte)(0xc0 + (c >> 6)); // 110x xxxx 10xx xxxx |
| 1313 | else { |
| 1314 | if ((c & 0xfc00) == 0xd800 && i + 1 < n && ((d = str.charAt(i + 1)) & 0xfc00) == 0xdc00) { // UTF-16 surrogate |
| 1315 | c = (c << 10) + d + (0x10000 - (0xd800 << 10) - 0xdc00); |
| 1316 | i++; |
| 1317 | buf[pos++] = (byte)(0xf0 + (c >> 18)); // 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx |
| 1318 | buf[pos++] = (byte)(0x80 + ((c >> 12) & 0x3f)); |
| 1319 | } else |
| 1320 | buf[pos++] = (byte)(0xe0 + (c >> 12)); // 1110 xxxx 10xx xxxx 10xx xxxx |
| 1321 | buf[pos++] = (byte)(0x80 + ((c >> 6) & 0x3f)); |
| 1322 | } |
| 1323 | buf[pos++] = (byte)(0x80 + (c & 0x3f)); |
| 1324 | } |
| 1325 | } |
| 1326 | } |
| 1327 | } |