diff options
| author | Sven de Marothy <sven@physto.se> | 2005-04-08 21:46:05 +0000 |
|---|---|---|
| committer | Sven de Marothy <sven@physto.se> | 2005-04-08 21:46:05 +0000 |
| commit | d619022a1d1b94506f2774b82daea02dde462e44 (patch) | |
| tree | 6628305b0ea627dc0a037df9c7e18e91d83ed62f /gnu/java/nio/charset/UTF_16Encoder.java | |
| parent | 9d37c49002f196b5aeb3a237903b1f0a23d77d1c (diff) | |
| download | classpath-d619022a1d1b94506f2774b82daea02dde462e44.tar.gz | |
2005-04-08 Sven de Marothy <sven@physto.se>
* gnu/java/nio/charset/Provider.java: Add new charsets.
* gnu/java/nio/charset/UTF_16.java: Default to using BOM.
* gnu/java/nio/charset/UTF_16Decoder.java: Minor fixes.
* gnu/java/nio/charset/UTF_16Encoder.java,
Use NIO's built-in byte-ordering instead.
* gnu/java/nio/charset/UTF_8.java,
(Decoder): Correct values of maximum chars per byte.
(decodeLoop): Handle 4-byte surrogates.
* gnu/java/nio/charset/ByteCharset.java
* gnu/java/nio/charset/Cp424.java
* gnu/java/nio/charset/Cp437.java
* gnu/java/nio/charset/Cp737.java
* gnu/java/nio/charset/Cp775.java
* gnu/java/nio/charset/Cp850.java
* gnu/java/nio/charset/Cp852.java
* gnu/java/nio/charset/Cp855.java
* gnu/java/nio/charset/Cp857.java
* gnu/java/nio/charset/Cp860.java
* gnu/java/nio/charset/Cp861.java
* gnu/java/nio/charset/Cp862.java
* gnu/java/nio/charset/Cp863.java
* gnu/java/nio/charset/Cp864.java
* gnu/java/nio/charset/Cp865.java
* gnu/java/nio/charset/Cp866.java
* gnu/java/nio/charset/Cp869.java
* gnu/java/nio/charset/Cp874.java
* gnu/java/nio/charset/EncodingHelper.java
* gnu/java/nio/charset/ISO_8859_13.java
* gnu/java/nio/charset/ISO_8859_15.java
* gnu/java/nio/charset/ISO_8859_2.java
* gnu/java/nio/charset/ISO_8859_3.java
* gnu/java/nio/charset/ISO_8859_4.java
* gnu/java/nio/charset/ISO_8859_5.java
* gnu/java/nio/charset/ISO_8859_6.java
* gnu/java/nio/charset/ISO_8859_7.java
* gnu/java/nio/charset/ISO_8859_8.java
* gnu/java/nio/charset/ISO_8859_9.java
* gnu/java/nio/charset/KOI_8.java
* gnu/java/nio/charset/MS874.java
* gnu/java/nio/charset/MacCentralEurope.java
* gnu/java/nio/charset/MacCroatian.java
* gnu/java/nio/charset/MacCyrillic.java
* gnu/java/nio/charset/MacDingbat.java
* gnu/java/nio/charset/MacGreek.java
* gnu/java/nio/charset/MacIceland.java
* gnu/java/nio/charset/MacRoman.java
* gnu/java/nio/charset/MacRomania.java
* gnu/java/nio/charset/MacSymbol.java
* gnu/java/nio/charset/MacThai.java
* gnu/java/nio/charset/MacTurkish.java
* gnu/java/nio/charset/Windows1250.java
* gnu/java/nio/charset/Windows1251.java
* gnu/java/nio/charset/Windows1252.java
* gnu/java/nio/charset/Windows1253.java
* gnu/java/nio/charset/Windows1254.java
* gnu/java/nio/charset/Windows1255.java
* gnu/java/nio/charset/Windows1256.java
* gnu/java/nio/charset/Windows1257.java
* gnu/java/nio/charset/Windows1258.java
New files.
Diffstat (limited to 'gnu/java/nio/charset/UTF_16Encoder.java')
| -rw-r--r-- | gnu/java/nio/charset/UTF_16Encoder.java | 48 |
1 files changed, 19 insertions, 29 deletions
diff --git a/gnu/java/nio/charset/UTF_16Encoder.java b/gnu/java/nio/charset/UTF_16Encoder.java index 8026e027b..b396c7304 100644 --- a/gnu/java/nio/charset/UTF_16Encoder.java +++ b/gnu/java/nio/charset/UTF_16Encoder.java @@ -38,6 +38,7 @@ exception statement from your version. */ package gnu.java.nio.charset; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; @@ -54,20 +55,21 @@ final class UTF_16Encoder extends CharsetEncoder static final int BIG_ENDIAN = 0; static final int LITTLE_ENDIAN = 1; - private static final char BYTE_ORDER_MARK = '\uFEFF'; + private static final char BYTE_ORDER_MARK = 0xFEFF; - private final int byteOrder; + private final ByteOrder byteOrder; private final boolean useByteOrderMark; private boolean needsByteOrderMark; UTF_16Encoder (Charset cs, int byteOrder, boolean useByteOrderMark) { super (cs, 2.0f, - useByteOrderMark ? 2.0f : 4.0f, + useByteOrderMark ? 4.0f : 2.0f, byteOrder == BIG_ENDIAN ? new byte[] { (byte) 0xFF, (byte) 0xFD } : new byte[] { (byte) 0xFD, (byte) 0xFF }); - this.byteOrder = byteOrder; + this.byteOrder = (byteOrder == BIG_ENDIAN) ? + ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; this.useByteOrderMark = useByteOrderMark; this.needsByteOrderMark = useByteOrderMark; } @@ -76,11 +78,17 @@ final class UTF_16Encoder extends CharsetEncoder { // TODO: Optimize this in the case in.hasArray() / out.hasArray() + ByteOrder originalBO = out.order(); + out.order(byteOrder); + if (needsByteOrderMark) { if (out.remaining () < 2) - return CoderResult.OVERFLOW; - put (out, BYTE_ORDER_MARK); + { + out.order(originalBO); + return CoderResult.OVERFLOW; + } + out.putChar (BYTE_ORDER_MARK); needsByteOrderMark = false; } @@ -90,7 +98,6 @@ final class UTF_16Encoder extends CharsetEncoder while (in.hasRemaining ()) { char c = in.get (); - if (0xD800 <= c && c <= 0xDFFF) { // c is a surrogate @@ -104,19 +111,20 @@ final class UTF_16Encoder extends CharsetEncoder // make sure d is a low surrogate if (d < 0xDC00 || d > 0xDFFF) return CoderResult.malformedForLength (1); - put (out, c); - put (out, d); + out.putChar (c); + out.putChar (d); inPos += 2; } else { + out.order(originalBO); if (out.remaining () < 2) return CoderResult.OVERFLOW; - put (out, c); + out.putChar (c); inPos++; } } - + out.order(originalBO); return CoderResult.UNDERFLOW; } finally @@ -125,24 +133,6 @@ final class UTF_16Encoder extends CharsetEncoder } } - /** - * Writes <code>c</code> to <code>out</code> in the byte order - * specified by <code>byteOrder</code>. - **/ - private void put (ByteBuffer out, char c) - { - if (byteOrder == BIG_ENDIAN) - { - out.put ((byte) (c >> 8)); - out.put ((byte) (c & 0xFF)); - } - else - { - out.put ((byte) (c & 0xFF)); - out.put ((byte) (c >> 8)); - } - } - protected void implReset () { needsByteOrderMark = useByteOrderMark; |
