/* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* */ package sun.nio.cs.ext; import java.nio.CharBuffer;import java.nio.ByteBuffer;import java.nio.charset.Charset;import java.nio.charset.CharsetDecoder;import java.nio.charset.CharsetEncoder;import java.nio.charset.CoderResult;import sun.nio.cs.HistoricallyNamedCharset; public class IBM964 extends Charset implements HistoricallyNamedCharset{ public IBM964() { super("x-IBM964", ExtendedCharsets.aliasesFor("x-IBM964")); } public String historicalName() { return "Cp964"; } public boolean contains(Charset cs) { return (cs instanceof IBM964); } public CharsetDecoder newDecoder() { return new Decoder(this); } public CharsetEncoder newEncoder() { return new Encoder(this); } /** * These accessors are temporarily supplied while sun.io * converters co-exist with the sun.nio.cs.{ext} charset coders * These facilitate sharing of conversion tables between the * two co-existing implementations. When sun.io converters * are made extinct these will be unncessary and should be removed */ public String getDecoderSingleByteMappings() { return Decoder.byteToCharTable; } public String getDecoderMappingTableG1() { return Decoder.mappingTableG1; } public String getDecoderMappingTableG2a2() { return Decoder.mappingTableG2a2; } public String getDecoderMappingTableG2ac() { return Decoder.mappingTableG2ac; } public String getDecoderMappingTableG2ad() { return Decoder.mappingTableG2ad; } public short[] getEncoderIndex1() { return Encoder.index1; } public String getEncoderIndex2() { return Encoder.index2; } public String getEncoderIndex2a() { return Encoder.index2a; } public String getEncoderIndex2b() { return Encoder.index2b; } public String getEncoderIndex2c() { return Encoder.index2c; } protected static class Decoder extends CharsetDecoder { private final int SS2 = 0x8E; private final int SS3 = 0x8F; private String mappingTableG2; public Decoder(Charset cs) { super(cs, 1.0f, 1.0f); } private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) { byte[] sa = src.array(); int sp = src.arrayOffset() + src.position(); int sl = src.arrayOffset() + src.limit(); assert (sp <= sl); sp = (sp <= sl ? sp : sl); char[] da = dst.array(); int dp = dst.arrayOffset() + dst.position(); int dl = dst.arrayOffset() + dst.limit(); assert (dp <= dl); dp = (dp <= dl ? dp : dl); try { while (sp < sl) { int byte1, byte2; int inputSize = 1; char outputChar = '\uFFFD'; byte1 = sa[sp] & 0xff; if (byte1 == SS2) { if (sl - sp < 4) { return CoderResult.UNDERFLOW; } byte1 = sa[sp + 1] & 0xff; inputSize = 2; if ( byte1 == 0xa2) mappingTableG2 = mappingTableG2a2; else if ( byte1 == 0xac) mappingTableG2 = mappingTableG2ac; else if ( byte1 == 0xad) mappingTableG2 = mappingTableG2ad; else return CoderResult.malformedForLength(2); byte1 = sa[sp + 2] & 0xff; if ( byte1 < 0xa1 || byte1 > 0xfe) { return CoderResult.malformedForLength(3); } byte2 = sa[sp + 3] & 0xff; if ( byte2 < 0xa1 || byte2 > 0xfe) { return CoderResult.malformedForLength(4); } inputSize = 4; outputChar = mappingTableG2.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1); } else if(byte1 == SS3 ) { return CoderResult.malformedForLength(1); } else if ( byte1 <= 0x9f ) { // valid single byte outputChar = byteToCharTable.charAt(byte1); } else if (byte1 < 0xa1 || byte1 > 0xfe) { // invalid range? return CoderResult.malformedForLength(1); } else { // G1 if (sl - sp < 2) { return CoderResult.UNDERFLOW; } byte2 = sa[sp + 1] & 0xff; inputSize = 2; if ( byte2 < 0xa1 || byte2 > 0xfe) { return CoderResult.malformedForLength(2); } outputChar = mappingTableG1.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1); } if (outputChar == '\uFFFD') return CoderResult.unmappableForLength(inputSize); if (dl - dp < 1) return CoderResult.OVERFLOW; da[dp++] = outputChar; sp += inputSize; } return CoderResult.UNDERFLOW; } finally { src.position(sp - src.arrayOffset()); dst.position(dp - dst.arrayOffset()); } } private CoderResult decodeBufferLoop(ByteBuffer src, CharBuffer dst) { int mark = src.position(); try { while (src.hasRemaining()) { int byte1, byte2; int inputSize = 1; char outputChar = '\uFFFD'; byte1 = src.get() & 0xff; if (byte1 == SS2) { if (src.remaining() < 3) return CoderResult.UNDERFLOW; byte1 = src.get() & 0xff; inputSize = 2; if ( byte1 == 0xa2) mappingTableG2 = mappingTableG2a2; else if ( byte1 == 0xac) mappingTableG2 = mappingTableG2ac; else if ( byte1 == 0xad) mappingTableG2 = mappingTableG2ad; else return CoderResult.malformedForLength(2); byte1 = src.get() & 0xff; if ( byte1 < 0xa1 || byte1 > 0xfe) return CoderResult.malformedForLength(3); byte2 = src.get() & 0xff; if ( byte2 < 0xa1 || byte2 > 0xfe) return CoderResult.malformedForLength(4); inputSize = 4; outputChar = mappingTableG2.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1); } else if (byte1 == SS3 ) { return CoderResult.malformedForLength(1); } else if ( byte1 <= 0x9f ) { // valid single byte outputChar = byteToCharTable.charAt(byte1); } else if (byte1 < 0xa1 || byte1 > 0xfe) { // invalid range? return CoderResult.malformedForLength(1); } else { // G1 if (src.remaining() < 1) return CoderResult.UNDERFLOW; byte2 = src.get() & 0xff; if ( byte2 < 0xa1 || byte2 > 0xfe) { return CoderResult.malformedForLength(2); } inputSize = 2; outputChar = mappingTableG1.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1); } if (outputChar == '\uFFFD') return CoderResult.unmappableForLength(inputSize); if (!dst.hasRemaining()) return CoderResult.OVERFLOW; dst.put(outputChar); mark += inputSize; } return CoderResult.UNDERFLOW; } finally { src.position(mark); } } protected CoderResult decodeLoop(ByteBuffer src, CharBuffer dst) { if (true && src.hasArray() && dst.hasArray()) return decodeArrayLoop(src, dst); else return decodeBufferLoop(src, dst); } private final static String byteToCharTable; private final static String mappingTableG1; private final static String mappingTableG2a2; private final static String mappingTableG2ac; private final static String mappingTableG2ad; static { byteToCharTable = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" + "\u0008\u0009\n\u000B\u000C\r\u000E\u000F" + "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" + "\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F" + "\u0020\u0021\"\u0023\u0024\u0025\u0026\u0027" + "\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F" + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037" + "\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F" + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047" + "\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F" + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057" + "\u0058\u0059\u005A\u005B\\\u005D\u005E\u005F" + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067" + "\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F" + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077" + "\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F" + "\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087" + "\u0088\u0089\u008A\u008B\u008C\u008D\uFFFD\uFFFD" + "\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097" + "\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F" ; mappingTableG1 = "\u3000\uFF0C\u3001\u3002\uFF0E\u2027\uFF1B\uFF1A" + "\uFF1F\uFF01\uFE30\u2026\u2025\uFE50\uFE51\uFE52" + "\u00B7\uFE54\uFE55\uFE56\uFE57\uFE31\u2014\uFE32" + "\uFE58\uFE33\u2574\uFE34\uFE4F\uFF08\uFF09\uFE35" + "\uFE36\uFF5B\uFF5D\uFE37\uFE38\u3014\u3015\uFE39" + "\uFE3A\u3010\u3011\uFE3B\uFE3C\u300A\u300B\uFE3D" + "\uFE3E\u3008\u3009\uFE3F\uFE40\u300C\u300D\uFE41" + "\uFE42\u300E\u300F\uFE43\uFE44\uFE59\uFE5A\uFE5B" + "\uFE5C\uFE5D\uFE5E\u2018\u2019\u201C\u201D\u301D" + "\u301E\u2035\u2032\uFF03\uFF06\uFF0A\u203B\u00A7" + "\u3003\u25CB\u25CF\u25B3\u25B2\u25CE\u2606\u2605" + "\u25C7\u25C6\u25A1\u25A0\u25BD\u25BC\u32A3\u2105" + "\u203E\uFFE3\uFF3F\u02CD\uFE49\uFE4A\uFE4D\uFE4E" + "\uFE4B\uFE4C\uFE5F\uFE60\uFE61\uFF0B\uFF0D\u00D7" + "\u00F7\u00B1\u221A\uFF1C\uFF1E\uFF1D\u2266\u2267" + "\u2260\u221E\u2252\u2261\uFE62\uFE63\uFE64\uFE65" + "\uFE66\u223C\u2229\u222A\u22A5\u2220\u221F\u22BF" + "\u33D2\u33D1\u222B\u222E\u2235\u2234\u2640\u2642" + "\u2295\u2299\u2191\u2193\u2192\u2190\u2196\u2197" + "\u2199\u2198\u2225\uFF5C\uFF0F\uFF3C\u2215\uFE68" + "\uFF04\uFFE5\u3012\uFFE0\uFFE1\uFF05\uFF20\u2103" + "\u2109\uFE69\uFE6A\uFE6B\u33D5\u339C\u339D\u339E" + "\u33CE\u33A1\u338E\u338F\u33C4\u00B0\u5159\u515B" + "\u515E\u515D\u5161\u5163\u55E7\u74E9\u7CCE\u2581" + "\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u258F" + "\u258E\u258D\u258C\u258B\u258A\u2589\u253C\u2534" + "\u252C\u2524\u251C\u2594\u2500\u2502\u2595\u250C" + "\u2510\u2514\u2518\u256D\u256E\u2570\u256F\u2550" + "\u255E\u256A\u2561\u25E2\u25E3\u25E5\u25E4\u2571" + "\u2572\u2573\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15" + "\uFF16\uFF17\uFF18\uFF19\u2160\u2161\u2162\u2163" + "\u2164\u2165\u2166\u2167\u2168\u2169\u3021\u3022" + "\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u5341" + "\u5344\u5345\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26" + "\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E" + "\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36" + "\uFF37\uFF38\uFF39\uFF3A\uFF41\uFF42\uFF43\uFF44" + "\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C" + "\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54" + "\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\u0391\u0392" + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A" + "\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3" + "\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2" + "\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA" + "\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3" + "\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u3105\u3106" + "\u3107\u3108\u3109\u310A\u310B\u310C\u310D\u310E" + "\u310F\u3110\u3111\u3112\u3113\u3114\u3115\u3116" + "\u3117\u3118\u3119\u311A\u311B\u311C\u311D\u311E" + "\u311F\u3120\u3121\u3122\u3123\u3124\u3125\u3126" + "\u3127\u3128\u3129\u02D9\u02C9\u02CA\u02C7\u02CB" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2460\u2461" + "\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469" + "\u2474\u2475\u2476\u2477\u2478\u2479\u247A\u247B" + "\u247C\u247D\u2170\u2171\u2172\u2173\u2174\u2175" + "\u2176\u2177\u2178\u2179\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\u4E00\u4E28\u4E36\u4E3F" + "\u4E59\u4E85\u4E8C\u4EA0\u4EBA\u513F\u5165\u516B" + "\u5182\u5196\u51AB\u51E0\u51F5\u5200\u529B\u52F9" + "\u5315\u531A\u5338\u5341\u535C\u5369\u5382\u53B6" + "\u53C8\u53E3\u56D7\u571F\u58EB\u590A\u5915\u5927" + "\u5973\u5B50\u5B80\u5BF8\u5C0F\u5C22\u5C38\u5C6E" + "\u5C71\u5DDB\u5DE5\u5DF1\u5DFE\u5E72\u5E7A\u5E7F" + "\u5EF4\u5EFE\u5F0B\u5F13\u5F50\u5F61\u5F73\u5FC3" + "\u6208\u6236\u624B\u652F\u6534\u6587\u6597\u65A4" + "\u65B9\u65E0\u65E5\u66F0\u6708\u6728\u6B20\u6B62" + "\u6B79\u6BB3\u6BCB\u6BD4\u6BDB\u6C0F\u6C14\u6C34" + "\u706B\u722A\u7236\u723B\u723F\u7247\u7259\u725B" + "\u72AC\u7384\u7389\u74DC\u74E6\u7518\u751F\u7528" + "\u7530\u758B\u7592\u7676\u767D\u76AE\u76BF\u76EE" + "\u77DB\u77E2\u77F3\u793A\u79B8\u79BE\u7A74\u7ACB" + "\u7AF9\u7C73\u7CF8\u7F36\u7F51\u7F8A\u7FBD\u8001" + "\u800C\u8012\u8033\u807F\u8089\u81E3\u81EA\u81F3" + "\u81FC\u820C\u821B\u821F\u826E\u8272\u8278\u864D" + "\u866B\u8840\u884C\u8863\u897E\u898B\u89D2\u8A00" + "\u8C37\u8C46\u8C55\u8C78\u8C9D\u8D64\u8D70\u8DB3" + "\u8EAB\u8ECA\u8F9B\u8FB0\u8FB5\u9091\u9149\u91C6" + "\u91CC\u91D1\u9577\u9580\u961C\u96B6\u96B9\u96E8" + "\u9752\u975E\u9762\u9769\u97CB\u97ED\u97F3\u9801" + "\u98A8\u98DB\u98DF\u9996\u9999\u99AC\u9AA8\u9AD8" + "\u9ADF\u9B25\u9B2F\u9B32\u9B3C\u9B5A\u9CE5\u9E75" + "\u9E7F\u9EA5\u9EBB\u9EC3\u9ECD\u9ED1\u9EF9\u9EFD" + "\u9F0E\u9F13\u9F20\u9F3B\u9F4A\u9F52\u9F8D\u9F9C" + "\u9FA0\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +Lines 1–500 of 10580. Load more
/* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* */ package sun.nio.cs.ext; import java.nio.CharBuffer; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; import sun.nio.cs.HistoricallyNamedCharset; public class IBM964 extends Charset implements HistoricallyNamedCharset { public IBM964() { super("x-IBM964", ExtendedCharsets.aliasesFor("x-IBM964")); } public String historicalName() { return "Cp964"; } public boolean contains(Charset cs) { return (cs instanceof IBM964); } public CharsetDecoder newDecoder() { return new Decoder(this); } public CharsetEncoder newEncoder() { return new Encoder(this); } /** * These accessors are temporarily supplied while sun.io * converters co-exist with the sun.nio.cs.{ext} charset coders * These facilitate sharing of conversion tables between the * two co-existing implementations. When sun.io converters * are made extinct these will be unncessary and should be removed */ public String getDecoderSingleByteMappings() { return Decoder.byteToCharTable; } public String getDecoderMappingTableG1() { return Decoder.mappingTableG1; } public String getDecoderMappingTableG2a2() { return Decoder.mappingTableG2a2; } public String getDecoderMappingTableG2ac() { return Decoder.mappingTableG2ac; } public String getDecoderMappingTableG2ad() { return Decoder.mappingTableG2ad; } public short[] getEncoderIndex1() { return Encoder.index1; } public String getEncoderIndex2() { return Encoder.index2; } public String getEncoderIndex2a() { return Encoder.index2a; } public String getEncoderIndex2b() { return Encoder.index2b; } public String getEncoderIndex2c() { return Encoder.index2c; } protected static class Decoder extends CharsetDecoder { private final int SS2 = 0x8E; private final int SS3 = 0x8F; private String mappingTableG2; public Decoder(Charset cs) { super(cs, 1.0f, 1.0f); } private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) { byte[] sa = src.array(); int sp = src.arrayOffset() + src.position(); int sl = src.arrayOffset() + src.limit(); assert (sp <= sl); sp = (sp <= sl ? sp : sl); char[] da = dst.array(); int dp = dst.arrayOffset() + dst.position(); int dl = dst.arrayOffset() + dst.limit(); assert (dp <= dl); dp = (dp <= dl ? dp : dl); try { while (sp < sl) { int byte1, byte2; int inputSize = 1; char outputChar = '\uFFFD'; byte1 = sa[sp] & 0xff; if (byte1 == SS2) { if (sl - sp < 4) { return CoderResult.UNDERFLOW; } byte1 = sa[sp + 1] & 0xff; inputSize = 2; if ( byte1 == 0xa2) mappingTableG2 = mappingTableG2a2; else if ( byte1 == 0xac) mappingTableG2 = mappingTableG2ac; else if ( byte1 == 0xad) mappingTableG2 = mappingTableG2ad; else return CoderResult.malformedForLength(2); byte1 = sa[sp + 2] & 0xff; if ( byte1 < 0xa1 || byte1 > 0xfe) { return CoderResult.malformedForLength(3); } byte2 = sa[sp + 3] & 0xff; if ( byte2 < 0xa1 || byte2 > 0xfe) { return CoderResult.malformedForLength(4); } inputSize = 4; outputChar = mappingTableG2.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1); } else if(byte1 == SS3 ) { return CoderResult.malformedForLength(1); } else if ( byte1 <= 0x9f ) { // valid single byte outputChar = byteToCharTable.charAt(byte1); } else if (byte1 < 0xa1 || byte1 > 0xfe) { // invalid range? return CoderResult.malformedForLength(1); } else { // G1 if (sl - sp < 2) { return CoderResult.UNDERFLOW; } byte2 = sa[sp + 1] & 0xff; inputSize = 2; if ( byte2 < 0xa1 || byte2 > 0xfe) { return CoderResult.malformedForLength(2); } outputChar = mappingTableG1.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1); } if (outputChar == '\uFFFD') return CoderResult.unmappableForLength(inputSize); if (dl - dp < 1) return CoderResult.OVERFLOW; da[dp++] = outputChar; sp += inputSize; } return CoderResult.UNDERFLOW; } finally { src.position(sp - src.arrayOffset()); dst.position(dp - dst.arrayOffset()); } } private CoderResult decodeBufferLoop(ByteBuffer src, CharBuffer dst) { int mark = src.position(); try { while (src.hasRemaining()) { int byte1, byte2; int inputSize = 1; char outputChar = '\uFFFD'; byte1 = src.get() & 0xff; if (byte1 == SS2) { if (src.remaining() < 3) return CoderResult.UNDERFLOW; byte1 = src.get() & 0xff; inputSize = 2; if ( byte1 == 0xa2) mappingTableG2 = mappingTableG2a2; else if ( byte1 == 0xac) mappingTableG2 = mappingTableG2ac; else if ( byte1 == 0xad) mappingTableG2 = mappingTableG2ad; else return CoderResult.malformedForLength(2); byte1 = src.get() & 0xff; if ( byte1 < 0xa1 || byte1 > 0xfe) return CoderResult.malformedForLength(3); byte2 = src.get() & 0xff; if ( byte2 < 0xa1 || byte2 > 0xfe) return CoderResult.malformedForLength(4); inputSize = 4; outputChar = mappingTableG2.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1); } else if (byte1 == SS3 ) { return CoderResult.malformedForLength(1); } else if ( byte1 <= 0x9f ) { // valid single byte outputChar = byteToCharTable.charAt(byte1); } else if (byte1 < 0xa1 || byte1 > 0xfe) { // invalid range? return CoderResult.malformedForLength(1); } else { // G1 if (src.remaining() < 1) return CoderResult.UNDERFLOW; byte2 = src.get() & 0xff; if ( byte2 < 0xa1 || byte2 > 0xfe) { return CoderResult.malformedForLength(2); } inputSize = 2; outputChar = mappingTableG1.charAt(((byte1 - 0xa1) * 94) + byte2 - 0xa1); } if (outputChar == '\uFFFD') return CoderResult.unmappableForLength(inputSize); if (!dst.hasRemaining()) return CoderResult.OVERFLOW; dst.put(outputChar); mark += inputSize; } return CoderResult.UNDERFLOW; } finally { src.position(mark); } } protected CoderResult decodeLoop(ByteBuffer src, CharBuffer dst) { if (true && src.hasArray() && dst.hasArray()) return decodeArrayLoop(src, dst); else return decodeBufferLoop(src, dst); } private final static String byteToCharTable; private final static String mappingTableG1; private final static String mappingTableG2a2; private final static String mappingTableG2ac; private final static String mappingTableG2ad; static { byteToCharTable = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" + "\u0008\u0009\n\u000B\u000C\r\u000E\u000F" + "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" + "\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F" + "\u0020\u0021\"\u0023\u0024\u0025\u0026\u0027" + "\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F" + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037" + "\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F" + "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047" + "\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F" + "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057" + "\u0058\u0059\u005A\u005B\\\u005D\u005E\u005F" + "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067" + "\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F" + "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077" + "\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u007F" + "\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087" + "\u0088\u0089\u008A\u008B\u008C\u008D\uFFFD\uFFFD" + "\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097" + "\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F" ; mappingTableG1 = "\u3000\uFF0C\u3001\u3002\uFF0E\u2027\uFF1B\uFF1A" + "\uFF1F\uFF01\uFE30\u2026\u2025\uFE50\uFE51\uFE52" + "\u00B7\uFE54\uFE55\uFE56\uFE57\uFE31\u2014\uFE32" + "\uFE58\uFE33\u2574\uFE34\uFE4F\uFF08\uFF09\uFE35" + "\uFE36\uFF5B\uFF5D\uFE37\uFE38\u3014\u3015\uFE39" + "\uFE3A\u3010\u3011\uFE3B\uFE3C\u300A\u300B\uFE3D" + "\uFE3E\u3008\u3009\uFE3F\uFE40\u300C\u300D\uFE41" + "\uFE42\u300E\u300F\uFE43\uFE44\uFE59\uFE5A\uFE5B" + "\uFE5C\uFE5D\uFE5E\u2018\u2019\u201C\u201D\u301D" + "\u301E\u2035\u2032\uFF03\uFF06\uFF0A\u203B\u00A7" + "\u3003\u25CB\u25CF\u25B3\u25B2\u25CE\u2606\u2605" + "\u25C7\u25C6\u25A1\u25A0\u25BD\u25BC\u32A3\u2105" + "\u203E\uFFE3\uFF3F\u02CD\uFE49\uFE4A\uFE4D\uFE4E" + "\uFE4B\uFE4C\uFE5F\uFE60\uFE61\uFF0B\uFF0D\u00D7" + "\u00F7\u00B1\u221A\uFF1C\uFF1E\uFF1D\u2266\u2267" + "\u2260\u221E\u2252\u2261\uFE62\uFE63\uFE64\uFE65" + "\uFE66\u223C\u2229\u222A\u22A5\u2220\u221F\u22BF" + "\u33D2\u33D1\u222B\u222E\u2235\u2234\u2640\u2642" + "\u2295\u2299\u2191\u2193\u2192\u2190\u2196\u2197" + "\u2199\u2198\u2225\uFF5C\uFF0F\uFF3C\u2215\uFE68" + "\uFF04\uFFE5\u3012\uFFE0\uFFE1\uFF05\uFF20\u2103" + "\u2109\uFE69\uFE6A\uFE6B\u33D5\u339C\u339D\u339E" + "\u33CE\u33A1\u338E\u338F\u33C4\u00B0\u5159\u515B" + "\u515E\u515D\u5161\u5163\u55E7\u74E9\u7CCE\u2581" + "\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u258F" + "\u258E\u258D\u258C\u258B\u258A\u2589\u253C\u2534" + "\u252C\u2524\u251C\u2594\u2500\u2502\u2595\u250C" + "\u2510\u2514\u2518\u256D\u256E\u2570\u256F\u2550" + "\u255E\u256A\u2561\u25E2\u25E3\u25E5\u25E4\u2571" + "\u2572\u2573\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15" + "\uFF16\uFF17\uFF18\uFF19\u2160\u2161\u2162\u2163" + "\u2164\u2165\u2166\u2167\u2168\u2169\u3021\u3022" + "\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u5341" + "\u5344\u5345\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26" + "\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E" + "\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36" + "\uFF37\uFF38\uFF39\uFF3A\uFF41\uFF42\uFF43\uFF44" + "\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C" + "\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54" + "\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\u0391\u0392" + "\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A" + "\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3" + "\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2" + "\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA" + "\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3" + "\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u3105\u3106" + "\u3107\u3108\u3109\u310A\u310B\u310C\u310D\u310E" + "\u310F\u3110\u3111\u3112\u3113\u3114\u3115\u3116" + "\u3117\u3118\u3119\u311A\u311B\u311C\u311D\u311E" + "\u311F\u3120\u3121\u3122\u3123\u3124\u3125\u3126" + "\u3127\u3128\u3129\u02D9\u02C9\u02CA\u02C7\u02CB" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2460\u2461" + "\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469" + "\u2474\u2475\u2476\u2477\u2478\u2479\u247A\u247B" + "\u247C\u247D\u2170\u2171\u2172\u2173\u2174\u2175" + "\u2176\u2177\u2178\u2179\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\u4E00\u4E28\u4E36\u4E3F" + "\u4E59\u4E85\u4E8C\u4EA0\u4EBA\u513F\u5165\u516B" + "\u5182\u5196\u51AB\u51E0\u51F5\u5200\u529B\u52F9" + "\u5315\u531A\u5338\u5341\u535C\u5369\u5382\u53B6" + "\u53C8\u53E3\u56D7\u571F\u58EB\u590A\u5915\u5927" + "\u5973\u5B50\u5B80\u5BF8\u5C0F\u5C22\u5C38\u5C6E" + "\u5C71\u5DDB\u5DE5\u5DF1\u5DFE\u5E72\u5E7A\u5E7F" + "\u5EF4\u5EFE\u5F0B\u5F13\u5F50\u5F61\u5F73\u5FC3" + "\u6208\u6236\u624B\u652F\u6534\u6587\u6597\u65A4" + "\u65B9\u65E0\u65E5\u66F0\u6708\u6728\u6B20\u6B62" + "\u6B79\u6BB3\u6BCB\u6BD4\u6BDB\u6C0F\u6C14\u6C34" + "\u706B\u722A\u7236\u723B\u723F\u7247\u7259\u725B" + "\u72AC\u7384\u7389\u74DC\u74E6\u7518\u751F\u7528" + "\u7530\u758B\u7592\u7676\u767D\u76AE\u76BF\u76EE" + "\u77DB\u77E2\u77F3\u793A\u79B8\u79BE\u7A74\u7ACB" + "\u7AF9\u7C73\u7CF8\u7F36\u7F51\u7F8A\u7FBD\u8001" + "\u800C\u8012\u8033\u807F\u8089\u81E3\u81EA\u81F3" + "\u81FC\u820C\u821B\u821F\u826E\u8272\u8278\u864D" + "\u866B\u8840\u884C\u8863\u897E\u898B\u89D2\u8A00" + "\u8C37\u8C46\u8C55\u8C78\u8C9D\u8D64\u8D70\u8DB3" + "\u8EAB\u8ECA\u8F9B\u8FB0\u8FB5\u9091\u9149\u91C6" + "\u91CC\u91D1\u9577\u9580\u961C\u96B6\u96B9\u96E8" + "\u9752\u975E\u9762\u9769\u97CB\u97ED\u97F3\u9801" + "\u98A8\u98DB\u98DF\u9996\u9999\u99AC\u9AA8\u9AD8" + "\u9ADF\u9B25\u9B2F\u9B32\u9B3C\u9B5A\u9CE5\u9E75" + "\u9E7F\u9EA5\u9EBB\u9EC3\u9ECD\u9ED1\u9EF9\u9EFD" + "\u9F0E\u9F13\u9F20\u9F3B\u9F4A\u9F52\u9F8D\u9F9C" + "\u9FA0\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" +