src/share/classes/sun/nio/cs/SingleByte.java
Print this page
*** 30,39 ****
--- 30,40 ----
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CoderResult;
+ import java.util.Arrays;
import static sun.nio.cs.CharsetMapping.*;
public class SingleByte
{
private static final CoderResult withResult(CoderResult cr,
*** 43,53 ****
src.position(sp - src.arrayOffset());
dst.position(dp - dst.arrayOffset());
return cr;
}
! public static class Decoder extends CharsetDecoder {
private final char[] b2c;
public Decoder(Charset cs, char[] b2c) {
super(cs, 1.0f, 1.0f);
this.b2c = b2c;
--- 44,55 ----
src.position(sp - src.arrayOffset());
dst.position(dp - dst.arrayOffset());
return cr;
}
! final public static class Decoder extends CharsetDecoder
! implements ArrayDecoder {
private final char[] b2c;
public Decoder(Charset cs, char[] b2c) {
super(cs, 1.0f, 1.0f);
this.b2c = b2c;
*** 106,118 ****
}
private final char decode(int b) {
return b2c[b + 128];
}
}
! public static class Encoder extends CharsetEncoder {
private Surrogate.Parser sgp;
private final char[] c2b;
private final char[] c2bIndex;
public Encoder(Charset cs, char[] c2b, char[] c2bIndex) {
--- 108,140 ----
}
private final char decode(int b) {
return b2c[b + 128];
}
+
+ private char repl = '\uFFFD';
+ protected void implReplaceWith(String newReplacement) {
+ repl = newReplacement.charAt(0);
}
! public int decode(byte[] src, int sp, int len, char[] dst) {
! if (len > dst.length)
! len = dst.length;
! int dp = 0;
! while (dp < len) {
! dst[dp] = decode(src[sp++]);
! if (dst[dp] == UNMAPPABLE_DECODING) {
! dst[dp] = repl;
! }
! dp++;
! }
! return dp;
! }
! }
!
! final public static class Encoder extends CharsetEncoder
! implements ArrayEncoder {
private Surrogate.Parser sgp;
private final char[] c2b;
private final char[] c2bIndex;
public Encoder(Charset cs, char[] c2b, char[] c2bIndex) {
*** 123,132 ****
--- 145,159 ----
public boolean canEncode(char c) {
return encode(c) != UNMAPPABLE_ENCODING;
}
+ public boolean isLegalReplacement(byte[] repl) {
+ return ((repl.length == 1 && repl[0] == (byte)'?') ||
+ super.isLegalReplacement(repl));
+ }
+
private CoderResult encodeArrayLoop(CharBuffer src, ByteBuffer dst) {
char[] sa = src.array();
int sp = src.arrayOffset() + src.position();
int sl = src.arrayOffset() + src.limit();
*** 198,208 ****
--- 225,263 ----
char index = c2bIndex[ch >> 8];
if (index == UNMAPPABLE_ENCODING)
return UNMAPPABLE_ENCODING;
return c2b[index + (ch & 0xff)];
}
+
+ private byte repl = (byte)'?';
+ protected void implReplaceWith(byte[] newReplacement) {
+ repl = newReplacement[0];
}
+
+ public int encode(char[] src, int sp, int len, byte[] dst) {
+ int dp = 0;
+ int sl = sp + Math.min(len, dst.length);
+ while (sp < sl) {
+ char c = src[sp++];
+ int b = encode(c);
+ if (b != UNMAPPABLE_ENCODING) {
+ dst[dp++] = (byte)b;
+ continue;
+ }
+ if (Surrogate.isHigh(c) && sp < sl &&
+ Surrogate.isLow(src[sp])) {
+ if (len > dst.length) {
+ sl++;
+ len--;
+ }
+ sp++;
+ }
+ dst[dp++] = repl;
+ }
+ return dp;
+ }
+ }
// init the c2b and c2bIndex tables from b2c.
public static void initC2B(char[] b2c, char[] c2bNR,
char[] c2b, char[] c2bIndex) {
for (int i = 0; i < c2bIndex.length; i++)