1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.util;
18
19 import java.io.UnsupportedEncodingException;
20 import java.nio.charset.Charset;
21 import java.nio.charset.StandardCharsets;
22
23
24
25
26
27
28 public final class StringEncoder {
29
30 private StringEncoder() {
31 }
32
33
34
35
36
37
38
39
40 public static byte[] toBytes(final String str, final Charset charset) {
41 if (str != null) {
42 if (StandardCharsets.ISO_8859_1.equals(charset)) {
43 return encodeSingleByteChars(str);
44 }
45 final Charset actual = charset != null ? charset : Charset.defaultCharset();
46 try {
47 return str.getBytes(actual.name());
48 } catch (final UnsupportedEncodingException e) {
49 return str.getBytes(actual);
50 }
51 }
52 return null;
53 }
54
55
56
57
58
59
60
61
62 public static byte[] encodeSingleByteChars(final CharSequence s) {
63 final int length = s.length();
64 final byte[] result = new byte[length];
65 encodeString(s, 0, length, result);
66 return result;
67 }
68
69
70
71
72
73
74 public static int encodeIsoChars(final CharSequence charArray, int charIndex, final byte[] byteArray, int byteIndex, final int length) {
75 int i = 0;
76 for (; i < length; i++) {
77 final char c = charArray.charAt(charIndex++);
78 if (c > 255) {
79 break;
80 }
81 byteArray[(byteIndex++)] = ((byte) c);
82 }
83 return i;
84 }
85
86
87 public static int encodeString(final CharSequence charArray, int charOffset, int charLength, final byte[] byteArray) {
88 int byteOffset = 0;
89 int length = Math.min(charLength, byteArray.length);
90 int charDoneIndex = charOffset + length;
91 while (charOffset < charDoneIndex) {
92 final int done = encodeIsoChars(charArray, charOffset, byteArray, byteOffset, length);
93 charOffset += done;
94 byteOffset += done;
95 if (done != length) {
96 final char c = charArray.charAt(charOffset++);
97 if ((Character.isHighSurrogate(c)) && (charOffset < charDoneIndex)
98 && (Character.isLowSurrogate(charArray.charAt(charOffset)))) {
99 if (charLength > byteArray.length) {
100 charDoneIndex++;
101 charLength--;
102 }
103 charOffset++;
104 }
105 byteArray[(byteOffset++)] = '?';
106 length = Math.min(charDoneIndex - charOffset, byteArray.length - byteOffset);
107 }
108 }
109 return byteOffset;
110 }
111 }