equal
deleted
inserted
replaced
61 |
61 |
62 public CharsetEncoder newEncoder() { |
62 public CharsetEncoder newEncoder() { |
63 return new Encoder(this); |
63 return new Encoder(this); |
64 } |
64 } |
65 |
65 |
66 private static class Decoder extends CharsetDecoder |
66 private static class Decoder extends CharsetDecoder { |
67 implements ArrayDecoder { |
67 |
68 private Decoder(Charset cs) { |
68 private Decoder(Charset cs) { |
69 super(cs, 1.0f, 1.0f); |
69 super(cs, 1.0f, 1.0f); |
70 } |
70 } |
71 |
71 |
72 private CoderResult decodeArrayLoop(ByteBuffer src, |
72 private CoderResult decodeArrayLoop(ByteBuffer src, |
122 if (src.hasArray() && dst.hasArray()) |
122 if (src.hasArray() && dst.hasArray()) |
123 return decodeArrayLoop(src, dst); |
123 return decodeArrayLoop(src, dst); |
124 else |
124 else |
125 return decodeBufferLoop(src, dst); |
125 return decodeBufferLoop(src, dst); |
126 } |
126 } |
127 |
127 } |
128 public int decode(byte[] src, int sp, int len, char[] dst) { |
128 |
129 if (len > dst.length) |
129 private static class Encoder extends CharsetEncoder { |
130 len = dst.length; |
130 |
131 int dp = 0; |
|
132 while (dp < len) |
|
133 dst[dp++] = (char)(src[sp++] & 0xff); |
|
134 return dp; |
|
135 } |
|
136 |
|
137 public boolean isASCIICompatible() { |
|
138 return true; |
|
139 } |
|
140 } |
|
141 |
|
142 private static class Encoder extends CharsetEncoder |
|
143 implements ArrayEncoder { |
|
144 private Encoder(Charset cs) { |
131 private Encoder(Charset cs) { |
145 super(cs, 1.0f, 1.0f); |
132 super(cs, 1.0f, 1.0f); |
146 } |
133 } |
147 |
134 |
148 public boolean canEncode(char c) { |
135 public boolean canEncode(char c) { |
269 if (src.hasArray() && dst.hasArray()) |
256 if (src.hasArray() && dst.hasArray()) |
270 return encodeArrayLoop(src, dst); |
257 return encodeArrayLoop(src, dst); |
271 else |
258 else |
272 return encodeBufferLoop(src, dst); |
259 return encodeBufferLoop(src, dst); |
273 } |
260 } |
274 |
|
275 private byte repl = (byte)'?'; |
|
276 protected void implReplaceWith(byte[] newReplacement) { |
|
277 repl = newReplacement[0]; |
|
278 } |
|
279 |
|
280 public int encode(char[] src, int sp, int len, byte[] dst) { |
|
281 int dp = 0; |
|
282 int slen = Math.min(len, dst.length); |
|
283 int sl = sp + slen; |
|
284 while (sp < sl) { |
|
285 int ret = encodeISOArray(src, sp, dst, dp, slen); |
|
286 sp = sp + ret; |
|
287 dp = dp + ret; |
|
288 if (ret != slen) { |
|
289 char c = src[sp++]; |
|
290 if (Character.isHighSurrogate(c) && sp < sl && |
|
291 Character.isLowSurrogate(src[sp])) { |
|
292 if (len > dst.length) { |
|
293 sl++; |
|
294 len--; |
|
295 } |
|
296 sp++; |
|
297 } |
|
298 dst[dp++] = repl; |
|
299 slen = Math.min((sl - sp), (dst.length - dp)); |
|
300 } |
|
301 } |
|
302 return dp; |
|
303 } |
|
304 |
|
305 public boolean isASCIICompatible() { |
|
306 return true; |
|
307 } |
|
308 } |
261 } |
309 } |
262 } |