All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.abdera.i18n.text.Nameprep Maven / Gradle / Ivy

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.  For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.abdera.i18n.text;


/**
 * Implements the Nameprep protocol
 */
public class Nameprep {

  public static String prep(String s) {
    NameprepCodepointIterator r = null;
    try {
      StringBuilder buf = new StringBuilder();
      CodepointIterator ci = CodepointIterator.forCharSequence(s);
      r = new NameprepCodepointIterator(ci);
      while(r.hasNext()) {
        Codepoint cp = r.next();
        int i = cp != null ? cp.getValue() : -1;
        if (i != -1) {
          CharUtils.append(buf, cp);
        }
      }
      String n = Normalizer.normalize(
        buf.toString(),
        Normalizer.Form.KC).toString();
      CharUtils.verify(
        CodepointIterator.forCharSequence(n), 
        new Filter() {
          public boolean accept(int c) {
            return isProhibited(c);
          }
        }
      );
      return n;
    } catch (Throwable e) {
      return null;
    }
  }
  
  private static class NameprepCodepointIterator 
    extends DelegatingCodepointIterator {
  
    private int[] rep = null;
    private int reppos = 0;
    private boolean haslcat = false;
    private boolean hasrandalcat = false;
    private boolean firstisrandalcat = false;
    
    @Override
    public boolean hasNext() {
      return rep != null || super.hasNext();
    }
    
    protected NameprepCodepointIterator(
      CodepointIterator internal) {
        super(internal);
    }
  
    @Override
    public Codepoint next() {
      int r = -1;
      if (this.rep == null) {
        r = super.next().getValue();
        if (r != -1) {
          if (Nameprep.isLCat(r)) haslcat = true;
          if (Nameprep.isRandAL(r)) {
            hasrandalcat = true;
            if (position() == 1) firstisrandalcat = true;
          }
          if (haslcat && hasrandalcat) 
            throw new RuntimeException("Bidi Exception");
          while(r != -1 && Nameprep.isB1(r)) {
            Codepoint cp = super.next();
            r = cp != null ? cp.getValue() : -1;
          }
          if (r != -1) {
            int[] rep = Nameprep.B2(r);
            if (rep != null) {
              if (rep.length > 1) {
                this.rep = rep;
                reppos = 0;
              }
              r = rep[0];
            }
          }
        }
      } else { 
        r = rep[++reppos];
        if (reppos+1 >= rep.length) rep = null;
      }
      if ((r == -1 || !hasNext()) && 
          hasrandalcat && 
          (!firstisrandalcat || 
           !Nameprep.isRandAL((r ==-1)?peek(position()).getValue():r))) {
        throw new RuntimeException("Bidi Exception");
      }
      return r != -1 ? new Codepoint(r) : null;
    }
  
    @Override
    public char[] nextChars() {
      return super.nextChars();
    }
  
  }
    
  
  
  private static final int[] B1 = {
    0x80, 0x81, 0x86, 0x88,
    0x8B, 0x8F, 0xA0, 0x00AD,
    0x034F, 0x1806, 0x180B,
    0x180C, 0x180D, 0x200B,
    0x200C, 0x200D, 0x2060,
    0xFE00, 0xFE01, 0xFE02,
    0xFE03, 0xFE04, 0xFE05,
    0xFE06, 0xFE07, 0xFE08,
    0xFE09, 0xFE0A, 0xFE0B,
    0xFE0C, 0xFE0D, 0xFE0E,
    0xFE0F, 0xFEFF,
  };
  
  private static final int[] PROHIBITED = {
    0x0080,   0x00A1,
    0x0340,   0x0342,
    0x06DD,   0x06DE,
    0x070F,   0x0810,
    0x1680,   0x1681,
    0x180E,   0x180F,
    0x2000,   0x2010,
    0x2028,   0x202A,
    0x202A,   0x2030,
    0x205F,   0x2060,
    0x2060,   0x2064,
    0x206A,   0x2070,
    0x2FF0,   0x2FFC,
    0x3000,   0x3001,
    0xD800,   0xF900,
    0xFDD0,   0xFDF0,
    0xFEFF,   0xFF00,
    0xFFF9,   0xFFFE,
    0x1D173,  0x1D17B,
    0xE0001,  0xE0002,
    0xE0020,  0xE0080,
    0xF0000,  0xFFFFE,
    0x100000, 0x10FFFE
  };
  
  private static final int[] RandAL = {
    0x05BE,0x05BF,
    0x05C0,0x05C1,
    0x05C3,0x05C4,
    0x05D0,0x05EB,
    0x05F0,0x05F5,
    0x061B,0x061C,
    0x061F,0x0620,
    0x0621,0x063B,
    0x0640,0x064B,
    0x066D,0x0670,
    0x0671,0x06D6,
    0x06DD,0x06DE,
    0x06E5,0x06E7,
    0x06FA,0x06FF,
    0x0700,0x070E,
    0x0710,0x0711,
    0x0712,0x072D,
    0x0780,0x07A6,
    0x07B1,0x07B2,
    0x200F,0x2010,
    0xFB1D,0xFB1E,
    0xFB1F,0xFB29,
    0xFB2A,0xFB37,
    0xFB38,0xFB3D,
    0xFB3E,0xFB3F,
    0xFB40,0xFB42,
    0xFB43,0xFB45,
    0xFB46,0xFBB2,
    0xFBD3,0xFD3E,
    0xFD50,0xFD90,
    0xFD92,0xFDC8,
    0xFDF0,0xFDFD,
    0xFE70,0xFE75,
    0xFE76,0xFEFD
  };
  
  private static final int[] notLCat = {
    0x0, 0x41,
    0x5b, 0x61,
    0x7b, 0xaa,
    0xab, 0xb5,
    0xb6, 0xba,
    0xbb, 0xc0,
    0xd7, 0xd8,
    0xf7, 0xf8,
    0x221, 0x222,
    0x234, 0x250,
    0x2ae, 0x2b0,
    0x2b9, 0x2bb,
    0x2c2, 0x2d0,
    0x2d2, 0x2e0,
    0x2e5, 0x2ee,
    0x2ef, 0x37a,
    0x37b, 0x386,
    0x387, 0x388,
    0x38b, 0x38c,
    0x38d, 0x38e,
    0x3a2, 0x3a3,
    0x3cf, 0x3d0,
    0x3f6, 0x400,
    0x483, 0x48a,
    0x4cf, 0x4d0,
    0x4f6, 0x4f8,
    0x4fa, 0x500,
    0x510, 0x531,
    0x557, 0x559,
    0x560, 0x561,
    0x588, 0x589,
    0x58a, 0x903,
    0x904, 0x905,
    0x93a, 0x93d,
    0x941, 0x949,
    0x94d, 0x950,
    0x951, 0x958,
    0x962, 0x964,
    0x971, 0x982,
    0x984, 0x985,
    0x98d, 0x98f,
    0x991, 0x993,
    0x9a9, 0x9aa,
    0x9b1, 0x9b2,
    0x9b3, 0x9b6,
    0x9ba, 0x9be,
    0x9c1, 0x9c7,
    0x9c9, 0x9cb,
    0x9cd, 0x9d7,
    0x9d8, 0x9dc,
    0x9de, 0x9df,
    0x9e2, 0x9e6,
    0x9f2, 0x9f4,
    0x9fb, 0xa05,
    0xa0b, 0xa0f,
    0xa11, 0xa13,
    0xa29, 0xa2a,
    0xa31, 0xa32,
    0xa34, 0xa35,
    0xa37, 0xa38,
    0xa3a, 0xa3e,
    0xa41, 0xa59,
    0xa5d, 0xa5e,
    0xa5f, 0xa66,
    0xa70, 0xa72,
    0xa75, 0xa83,
    0xa84, 0xa85,
    0xa8c, 0xa8d,
    0xa8e, 0xa8f,
    0xa92, 0xa93,
    0xaa9, 0xaaa,
    0xab1, 0xab2,
    0xab4, 0xab5,
    0xaba, 0xabd,
    0xac1, 0xac9,
    0xaca, 0xacb,
    0xacd, 0xad0,
    0xad1, 0xae0,
    0xae1, 0xae6,
    0xaf0, 0xb02,
    0xb04, 0xb05,
    0xb0d, 0xb0f,
    0xb11, 0xb13,
    0xb29, 0xb2a,
    0xb31, 0xb32,
    0xb34, 0xb36,
    0xb3a, 0xb3d,
    0xb3f, 0xb40,
    0xb41, 0xb47,
    0xb49, 0xb4b,
    0xb4d, 0xb57,
    0xb58, 0xb5c,
    0xb5e, 0xb5f,
    0xb62, 0xb66,
    0xb71, 0xb83,
    0xb84, 0xb85,
    0xb8b, 0xb8e,
    0xb91, 0xb92,
    0xb96, 0xb99,
    0xb9b, 0xb9c,
    0xb9d, 0xb9e,
    0xba0, 0xba3,
    0xba5, 0xba8,
    0xbab, 0xbae,
    0xbb6, 0xbb7,
    0xbba, 0xbbe,
    0xbc0, 0xbc1,
    0xbc3, 0xbc6,
    0xbc9, 0xbca,
    0xbcd, 0xbd7,
    0xbd8, 0xbe7,
    0xbf3, 0xc01,
    0xc04, 0xc05,
    0xc0d, 0xc0e,
    0xc11, 0xc12,
    0xc29, 0xc2a,
    0xc34, 0xc35,
    0xc3a, 0xc41,
    0xc45, 0xc60,
    0xc62, 0xc66,
    0xc70, 0xc82,
    0xc84, 0xc85,
    0xc8d, 0xc8e,
    0xc91, 0xc92,
    0xca9, 0xcaa,
    0xcb4, 0xcb5,
    0xcba, 0xcbe,
    0xcbf, 0xcc0,
    0xcc5, 0xcc7,
    0xcc9, 0xcca,
    0xccc, 0xcd5,
    0xcd7, 0xcde,
    0xcdf, 0xce0,
    0xce2, 0xce6,
    0xcf0, 0xd02,
    0xd04, 0xd05,
    0xd0d, 0xd0e,
    0xd11, 0xd12,
    0xd29, 0xd2a,
    0xd3a, 0xd3e,
    0xd41, 0xd46,
    0xd49, 0xd4a,
    0xd4d, 0xd57,
    0xd58, 0xd60,
    0xd62, 0xd66,
    0xd70, 0xd82,
    0xd84, 0xd85,
    0xd97, 0xd9a,
    0xdb2, 0xdb3,
    0xdbc, 0xdbd,
    0xdbe, 0xdc0,
    0xdc7, 0xdcf,
    0xdd2, 0xdd8,
    0xde0, 0xdf2,
    0xdf5, 0xe01,
    0xe31, 0xe32,
    0xe34, 0xe40,
    0xe47, 0xe4f,
    0xe5c, 0xe81,
    0xe83, 0xe84,
    0xe85, 0xe87,
    0xe89, 0xe8a,
    0xe8b, 0xe8d,
    0xe8e, 0xe94,
    0xe98, 0xe99,
    0xea0, 0xea1,
    0xea4, 0xea5,
    0xea6, 0xea7,
    0xea8, 0xeaa,
    0xeac, 0xead,
    0xeb1, 0xeb2,
    0xeb4, 0xebd,
    0xebe, 0xec0,
    0xec5, 0xec6,
    0xec7, 0xed0,
    0xeda, 0xedc,
    0xede, 0xf00,
    0xf18, 0xf1a,
    0xf35, 0xf36,
    0xf37, 0xf38,
    0xf39, 0xf3e,
    0xf48, 0xf49,
    0xf6b, 0xf7f,
    0xf80, 0xf85,
    0xf86, 0xf88,
    0xf8c, 0xfbe,
    0xfc6, 0xfc7,
    0xfcd, 0xfcf,
    0xfd0, 0x1000,
    0x1022, 0x1023,
    0x1028, 0x1029,
    0x102b, 0x102c,
    0x102d, 0x1031,
    0x1032, 0x1038,
    0x1039, 0x1040,
    0x1058, 0x10a0,
    0x10c6, 0x10d0,
    0x10f9, 0x10fb,
    0x10fc, 0x1100,
    0x115a, 0x115f,
    0x11a3, 0x11a8,
    0x11fa, 0x1200,
    0x1207, 0x1208,
    0x1247, 0x1248,
    0x1249, 0x124a,
    0x124e, 0x1250,
    0x1257, 0x1258,
    0x1259, 0x125a,
    0x125e, 0x1260,
    0x1287, 0x1288,
    0x1289, 0x128a,
    0x128e, 0x1290,
    0x12af, 0x12b0,
    0x12b1, 0x12b2,
    0x12b6, 0x12b8,
    0x12bf, 0x12c0,
    0x12c1, 0x12c2,
    0x12c6, 0x12c8,
    0x12cf, 0x12d0,
    0x12d7, 0x12d8,
    0x12ef, 0x12f0,
    0x130f, 0x1310,
    0x1311, 0x1312,
    0x1316, 0x1318,
    0x131f, 0x1320,
    0x1347, 0x1348,
    0x135b, 0x1361,
    0x137d, 0x13a0,
    0x13f5, 0x1401,
    0x1677, 0x1681,
    0x169b, 0x16a0,
    0x16f1, 0x1700,
    0x170d, 0x170e,
    0x1712, 0x1720,
    0x1732, 0x1735,
    0x1737, 0x1740,
    0x1752, 0x1760,
    0x176d, 0x176e,
    0x1771, 0x1780,
    0x17b7, 0x17be,
    0x17c6, 0x17c7,
    0x17c9, 0x17d4,
    0x17db, 0x17dc,
    0x17dd, 0x17e0,
    0x17ea, 0x1810,
    0x181a, 0x1820,
    0x1878, 0x1880,
    0x18a9, 0x1e00,
    0x1e9c, 0x1ea0,
    0x1efa, 0x1f00,
    0x1f16, 0x1f18,
    0x1f1e, 0x1f20,
    0x1f46, 0x1f48,
    0x1f4e, 0x1f50,
    0x1f58, 0x1f59,
    0x1f5a, 0x1f5b,
    0x1f5c, 0x1f5d,
    0x1f5e, 0x1f5f,
    0x1f7e, 0x1f80,
    0x1fb5, 0x1fb6,
    0x1fbd, 0x1fbe,
    0x1fbf, 0x1fc2,
    0x1fc5, 0x1fc6,
    0x1fcd, 0x1fd0,
    0x1fd4, 0x1fd6,
    0x1fdc, 0x1fe0,
    0x1fed, 0x1ff2,
    0x1ff5, 0x1ff6,
    0x1ffd, 0x200e,
    0x200f, 0x2071,
    0x2072, 0x207f,
    0x2080, 0x2102,
    0x2103, 0x2107,
    0x2108, 0x210a,
    0x2114, 0x2115,
    0x2116, 0x2119,
    0x211e, 0x2124,
    0x2125, 0x2126,
    0x2127, 0x2128,
    0x2129, 0x212a,
    0x212e, 0x212f,
    0x2132, 0x2133,
    0x213a, 0x213d,
    0x2140, 0x2145,
    0x214a, 0x2160,
    0x2184, 0x2336,
    0x237b, 0x2395,
    0x2396, 0x249c,
    0x24ea, 0x3005,
    0x3008, 0x3021,
    0x302a, 0x3031,
    0x3036, 0x3038,
    0x303d, 0x3041,
    0x3097, 0x309d,
    0x30a0, 0x30a1,
    0x30fb, 0x30fc,
    0x3100, 0x3105,
    0x312d, 0x3131,
    0x318f, 0x3190,
    0x31b8, 0x31f0,
    0x321d, 0x3220,
    0x3244, 0x3260,
    0x327c, 0x327f,
    0x32b1, 0x32c0,
    0x32cc, 0x32d0,
    0x32ff, 0x3300,
    0x3377, 0x337b,
    0x33de, 0x33e0,
    0x33ff, 0x3400,
    0x4db6, 0x4e00,
    0x9fa6, 0xa000,
    0xa48d, 0xac00,
    0xd7a4, 0xd800,
    0xfa2e, 0xfa30,
    0xfa6b, 0xfb00,
    0xfb07, 0xfb13,
    0xfb18, 0xff21,
    0xff3b, 0xff41,
    0xff5b, 0xff66,
    0xffbf, 0xffc2,
    0xffc8, 0xffca,
    0xffd0, 0xffd2,
    0xffd8, 0xffda,
    0xffdd, 0x10300,
    0x1031f, 0x10320,
    0x10324, 0x10330,
    0x1034b, 0x10400,
    0x10426, 0x10428,
    0x1044e, 0x1d000,
    0x1d0f6, 0x1d100,
    0x1d127, 0x1d12a,
    0x1d167, 0x1d16a,
    0x1d173, 0x1d183,
    0x1d185, 0x1d18c,
    0x1d1aa, 0x1d1ae,
    0x1d1de, 0x1d400,
    0x1d455, 0x1d456,
    0x1d49d, 0x1d49e,
    0x1d4a0, 0x1d4a2,
    0x1d4a3, 0x1d4a5,
    0x1d4a7, 0x1d4a9,
    0x1d4ad, 0x1d4ae,
    0x1d4ba, 0x1d4bb,
    0x1d4bc, 0x1d4bd,
    0x1d4c1, 0x1d4c2,
    0x1d4c4, 0x1d4c5,
    0x1d506, 0x1d507,
    0x1d50b, 0x1d50d,
    0x1d515, 0x1d516,
    0x1d51d, 0x1d51e,
    0x1d53a, 0x1d53b,
    0x1d53f, 0x1d540,
    0x1d545, 0x1d546,
    0x1d547, 0x1d54a,
    0x1d551, 0x1d552,
    0x1d6a4, 0x1d6a8,
    0x1d7ca, 0x20000,
    0x2a6d7, 0x2f800,
    0x2fa1e, 0xf0000,
    0xffffe, 0x100000,
    0x10fffe
  };
  
  public static final int[] b2index = {
      65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,
      85,86,87,88,89,90,181,192,193,194,195,196,197,198,199,200,201,202,203,204,
      205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,256,258,
      260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,
      300,302,304,306,308,310,313,315,317,319,321,323,325,327,329,330,332,334,336,338,
      340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,377,
      379,381,383,385,386,388,390,391,393,394,395,398,399,400,401,403,404,406,407,408,
      412,413,415,416,418,420,422,423,425,428,430,431,433,434,435,437,439,440,444,452,
      453,455,456,458,459,461,463,465,467,469,471,473,475,478,480,482,484,486,488,490,
      492,494,496,497,498,500,502,503,504,506,508,510,512,514,516,518,520,522,524,526,
      528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,837,890,
      902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,
      925,926,927,928,929,931,932,933,934,935,936,937,938,939,944,962,976,977,978,979,
      980,981,982,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1008,1009,1010,1012,1013,
      1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,
      1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,
      1064,1065,1066,1067,1068,1069,1070,1071,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,
      1144,1146,1148,1150,1152,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,
      1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1217,1219,1221,1223,1225,1227,1229,1232,
      1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1272,1280,
      1282,1284,1286,1288,1290,1292,1294,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,
      1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,
      1362,1363,1364,1365,1366,1415,7680,7682,7684,7686,7688,7690,7692,7694,7696,7698,7700,7702,7704,7706,
      7708,7710,7712,7714,7716,7718,7720,7722,7724,7726,7728,7730,7732,7734,7736,7738,7740,7742,7744,7746,
      7748,7750,7752,7754,7756,7758,7760,7762,7764,7766,7768,7770,7772,7774,7776,7778,7780,7782,7784,7786,
      7788,7790,7792,7794,7796,7798,7800,7802,7804,7806,7808,7810,7812,7814,7816,7818,7820,7822,7824,7826,
      7828,7830,7831,7832,7833,7834,7835,7840,7842,7844,7846,7848,7850,7852,7854,7856,7858,7860,7862,7864,
      7866,7868,7870,7872,7874,7876,7878,7880,7882,7884,7886,7888,7890,7892,7894,7896,7898,7900,7902,7904,
      7906,7908,7910,7912,7914,7916,7918,7920,7922,7924,7926,7928,7944,7945,7946,7947,7948,7949,7950,7951,
      7960,7961,7962,7963,7964,7965,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995,7996,7997,
      7998,7999,8008,8009,8010,8011,8012,8013,8016,8018,8020,8022,8025,8027,8029,8031,8040,8041,8042,8043,
      8044,8045,8046,8047,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,
      8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,
      8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8114,8115,8116,8118,8119,8120,8121,8122,
      8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8146,8147,8150,8151,8152,8153,8154,
      8155,8162,8163,8164,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,
      8188,8360,8450,8451,8455,8457,8459,8460,8461,8464,8465,8466,8469,8470,8473,8474,8475,8476,8477,8480,
      8481,8482,8484,8486,8488,8490,8491,8492,8493,8496,8497,8499,8510,8511,8517,8544,8545,8546,8547,8548,
      8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,9398,9399,9400,9401,9402,9403,9404,9405,9406,
      9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,13169,13171,13173,
      13184,13185,13186,13187,13188,13189,13190,13191,13194,13195,13196,13200,13201,13202,13203,13204,13225,13226,13227,13228,
      13236,13237,13238,13239,13240,13241,13242,13243,13244,13245,13246,13247,13248,13249,13251,13254,13255,13256,13257,13259,
      13261,13262,13271,13273,13274,13276,13277,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,65313,
      65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,
      65334,65335,65336,65337,65338,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,
      66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,
      66595,66596,66597,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,
      119825,119826,119827,119828,119829,119830,119831,119832,119833,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,
      119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119912,119913,119914,119915,119916,
      119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,
      119937,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,120016,
      120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,
      120037,120038,120039,120040,120041,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,
      120087,120088,120089,120090,120091,120092,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,
      120140,120141,120142,120143,120144,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,
      120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120224,120225,120226,120227,120228,120229,120230,120231,120232,
      120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120276,120277,120278,
      120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,
      120299,120300,120301,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,
      120345,120346,120347,120348,120349,120350,120351,120352,120353,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,
      120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120432,120433,120434,120435,120436,
      120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,
      120457,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,
      120507,120508,120509,120510,120511,120512,120531,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,
      120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120589,120604,120605,120606,120607,120608,120609,120610,
      120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120647,120662,
      120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,
      120683,120684,120685,120686,120705,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,
      120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120763};

    public static final int[][] b2data = {
      {97},{98},{99},{100},{101},{102},{103},{104},{105},{106},{107},{108},{109},{110},{111},{112},{113},{114},{115},{116},
      {117},{118},{119},{120},{121},{122},{956},{224},{225},{226},{227},{228},{229},{230},{231},{232},{233},{234},{235},{236},
      {237},{238},{239},{240},{241},{242},{243},{244},{245},{246},{248},{249},{250},{251},{252},{253},{254},{115,115},{257},{259},
      {261},{263},{265},{267},{269},{271},{273},{275},{277},{279},{281},{283},{285},{287},{289},{291},{293},{295},{297},{299},
      {301},{303},{105,775},{307},{309},{311},{314},{316},{318},{320},{322},{324},{326},{328},{700,110},{331},{333},{335},{337},{339},
      {341},{343},{345},{347},{349},{351},{353},{355},{357},{359},{361},{363},{365},{367},{369},{371},{373},{375},{255},{378},
      {380},{382},{115},{595},{387},{389},{596},{392},{598},{599},{396},{477},{601},{603},{402},{608},{611},{617},{616},{409},
      {623},{626},{629},{417},{419},{421},{640},{424},{643},{429},{648},{432},{650},{651},{436},{438},{658},{441},{445},{454},
      {454},{457},{457},{460},{460},{462},{464},{466},{468},{470},{472},{474},{476},{479},{481},{483},{485},{487},{489},{491},
      {493},{495},{106,780},{499},{499},{501},{405},{447},{505},{507},{509},{511},{513},{515},{517},{519},{521},{523},{525},{527},
      {529},{531},{533},{535},{537},{539},{541},{543},{414},{547},{549},{551},{553},{555},{557},{559},{561},{563},{953},{32,953},
      {940},{941},{942},{943},{972},{973},{974},{953,776,769},{945},{946},{947},{948},{949},{950},{951},{952},{953},{954},{955},{956},
      {957},{958},{959},{960},{961},{963},{964},{965},{966},{967},{968},{969},{970},{971},{965,776,769},{963},{946},{952},{965},{973},
      {971},{966},{960},{985},{987},{989},{991},{993},{995},{997},{999},{1001},{1003},{1005},{1007},{954},{961},{963},{952},{949},
      {1104},{1105},{1106},{1107},{1108},{1109},{1110},{1111},{1112},{1113},{1114},{1115},{1116},{1117},{1118},{1119},{1072},{1073},{1074},{1075},
      {1076},{1077},{1078},{1079},{1080},{1081},{1082},{1083},{1084},{1085},{1086},{1087},{1088},{1089},{1090},{1091},{1092},{1093},{1094},{1095},
      {1096},{1097},{1098},{1099},{1100},{1101},{1102},{1103},{1121},{1123},{1125},{1127},{1129},{1131},{1133},{1135},{1137},{1139},{1141},{1143},
      {1145},{1147},{1149},{1151},{1153},{1163},{1165},{1167},{1169},{1171},{1173},{1175},{1177},{1179},{1181},{1183},{1185},{1187},{1189},{1191},
      {1193},{1195},{1197},{1199},{1201},{1203},{1205},{1207},{1209},{1211},{1213},{1215},{1218},{1220},{1222},{1224},{1226},{1228},{1230},{1233},
      {1235},{1237},{1239},{1241},{1243},{1245},{1247},{1249},{1251},{1253},{1255},{1257},{1259},{1261},{1263},{1265},{1267},{1269},{1273},{1281},
      {1283},{1285},{1287},{1289},{1291},{1293},{1295},{1377},{1378},{1379},{1380},{1381},{1382},{1383},{1384},{1385},{1386},{1387},{1388},{1389},
      {1390},{1391},{1392},{1393},{1394},{1395},{1396},{1397},{1398},{1399},{1400},{1401},{1402},{1403},{1404},{1405},{1406},{1407},{1408},{1409},
      {1410},{1411},{1412},{1413},{1414},{1381,1410},{7681},{7683},{7685},{7687},{7689},{7691},{7693},{7695},{7697},{7699},{7701},{7703},{7705},{7707},
      {7709},{7711},{7713},{7715},{7717},{7719},{7721},{7723},{7725},{7727},{7729},{7731},{7733},{7735},{7737},{7739},{7741},{7743},{7745},{7747},
      {7749},{7751},{7753},{7755},{7757},{7759},{7761},{7763},{7765},{7767},{7769},{7771},{7773},{7775},{7777},{7779},{7781},{7783},{7785},{7787},
      {7789},{7791},{7793},{7795},{7797},{7799},{7801},{7803},{7805},{7807},{7809},{7811},{7813},{7815},{7817},{7819},{7821},{7823},{7825},{7827},
      {7829},{104,817},{116,776},{119,778},{121,778},{97,702},{7777},{7841},{7843},{7845},{7847},{7849},{7851},{7853},{7855},{7857},{7859},{7861},{7863},{7865},
      {7867},{7869},{7871},{7873},{7875},{7877},{7879},{7881},{7883},{7885},{7887},{7889},{7891},{7893},{7895},{7897},{7899},{7901},{7903},{7905},
      {7907},{7909},{7911},{7913},{7915},{7917},{7919},{7921},{7923},{7925},{7927},{7929},{7936},{7937},{7938},{7939},{7940},{7941},{7942},{7943},
      {7952},{7953},{7954},{7955},{7956},{7957},{7968},{7969},{7970},{7971},{7972},{7973},{7974},{7975},{7984},{7985},{7986},{7987},{7988},{7989},
      {7990},{7991},{8000},{8001},{8002},{8003},{8004},{8005},{965,787},{965,787,768},{965,787,769},{965,787,834},{8017},{8019},{8021},{8023},{8032},{8033},{8034},{8035},
      {8036},{8037},{8038},{8039},{7936,953},{7937,953},{7938,953},{7939,953},{7940,953},{7941,953},{7942,953},{7943,953},{7936,953},{7937,953},{7938,953},{7939,953},{7940,953},{7941,953},{7942,953},{7943,953},
      {7968,953},{7969,953},{7970,953},{7971,953},{7972,953},{7973,953},{7974,953},{7975,953},{7968,953},{7969,953},{7970,953},{7971,953},{7972,953},{7973,953},{7974,953},{7975,953},{8032,953},{8033,953},{8034,953},{8035,953},
      {8036,953},{8037,953},{8038,953},{8039,953},{8032,953},{8033,953},{8034,953},{8035,953},{8036,953},{8037,953},{8038,953},{8039,953},{8048,953},{945,953},{940,953},{945,834},{945,834,953},{8112},{8113},{8048},
      {8049},{945,953},{953},{8052,953},{951,953},{942,953},{951,834},{951,834,953},{8050},{8051},{8052},{8053},{951,953},{953,776,768},{953,776,769},{953,834},{953,776,834},{8144},{8145},{8054},
      {8055},{965,776,768},{965,776,769},{961,787},{965,834},{965,776,834},{8160},{8161},{8058},{8059},{8165},{8060,953},{969,953},{974,953},{969,834},{969,834,953},{8056},{8057},{8060},{8061},
      {969,953},{114,115},{99},{176,99},{603},{176,102},{104},{104},{104},{105},{105},{108},{110},{110,111},{112},{113},{114},{114},{114},{115,109},
      {116,101,108},{116,109},{122},{969},{122},{107},{229},{98},{99},{101},{102},{109},{947},{960},{100},{8560},{8561},{8562},{8563},{8564},
      {8565},{8566},{8567},{8568},{8569},{8570},{8571},{8572},{8573},{8574},{8575},{9424},{9425},{9426},{9427},{9428},{9429},{9430},{9431},{9432},
      {9433},{9434},{9435},{9436},{9437},{9438},{9439},{9440},{9441},{9442},{9443},{9444},{9445},{9446},{9447},{9448},{9449},{104,112,97},{97,117},{111,118},
      {112,97},{110,97},{956,97},{109,97},{107,97},{107,98},{109,98},{103,98},{112,102},{110,102},{956,102},{104,122},{107,104,122},{109,104,122},{103,104,122},{116,104,122},{112,97},{107,112,97},{109,112,97},{103,112,97},
      {112,118},{110,118},{956,118},{109,118},{107,118},{109,118},{112,119},{110,119},{956,119},{109,119},{107,119},{109,119},{107,969},{109,969},{98,113},{99,8725,107,103},{99,111,46},{100,98},{103,121},{104,112},
      {107,107},{107,109},{112,104},{112,112,109},{112,114},{115,118},{119,98},{102,102},{102,105},{102,108},{102,102,105},{102,102,108},{115,116},{115,116},{1396,1398},{1396,1381},{1396,1387},{1406,1398},{1396,1389},{65345},
      {65346},{65347},{65348},{65349},{65350},{65351},{65352},{65353},{65354},{65355},{65356},{65357},{65358},{65359},{65360},{65361},{65362},{65363},{65364},{65365},
      {65366},{65367},{65368},{65369},{65370},{66600},{66601},{66602},{66603},{66604},{66605},{66606},{66607},{66608},{66609},{66610},{66611},{66612},{66613},{66614},
      {66615},{66616},{66617},{66618},{66619},{66620},{66621},{66622},{66623},{66624},{66625},{66626},{66627},{66628},{66629},{66630},{66631},{66632},{66633},{66634},
      {66635},{66636},{66637},{97},{98},{99},{100},{101},{102},{103},{104},{105},{106},{107},{108},{109},{110},{111},{112},{113},
      {114},{115},{116},{117},{118},{119},{120},{121},{122},{97},{98},{99},{100},{101},{102},{103},{104},{105},{106},{107},
      {108},{109},{110},{111},{112},{113},{114},{115},{116},{117},{118},{119},{120},{121},{122},{97},{98},{99},{100},{101},
      {102},{103},{104},{105},{106},{107},{108},{109},{110},{111},{112},{113},{114},{115},{116},{117},{118},{119},{120},{121},
      {122},{97},{99},{100},{103},{106},{107},{110},{111},{112},{113},{115},{116},{117},{118},{119},{120},{121},{122},{97},
      {98},{99},{100},{101},{102},{103},{104},{105},{106},{107},{108},{109},{110},{111},{112},{113},{114},{115},{116},{117},
      {118},{119},{120},{121},{122},{97},{98},{100},{101},{102},{103},{106},{107},{108},{109},{110},{111},{112},{113},{115},
      {116},{117},{118},{119},{120},{121},{97},{98},{100},{101},{102},{103},{105},{106},{107},{108},{109},{111},{115},{116},
      {117},{118},{119},{120},{121},{97},{98},{99},{100},{101},{102},{103},{104},{105},{106},{107},{108},{109},{110},{111},
      {112},{113},{114},{115},{116},{117},{118},{119},{120},{121},{122},{97},{98},{99},{100},{101},{102},{103},{104},{105},
      {106},{107},{108},{109},{110},{111},{112},{113},{114},{115},{116},{117},{118},{119},{120},{121},{122},{97},{98},{99},
      {100},{101},{102},{103},{104},{105},{106},{107},{108},{109},{110},{111},{112},{113},{114},{115},{116},{117},{118},{119},
      {120},{121},{122},{97},{98},{99},{100},{101},{102},{103},{104},{105},{106},{107},{108},{109},{110},{111},{112},{113},
      {114},{115},{116},{117},{118},{119},{120},{121},{122},{97},{98},{99},{100},{101},{102},{103},{104},{105},{106},{107},
      {108},{109},{110},{111},{112},{113},{114},{115},{116},{117},{118},{119},{120},{121},{122},{97},{98},{99},{100},{101},
      {102},{103},{104},{105},{106},{107},{108},{109},{110},{111},{112},{113},{114},{115},{116},{117},{118},{119},{120},{121},
      {122},{945},{946},{947},{948},{949},{950},{951},{952},{953},{954},{955},{956},{957},{958},{959},{960},{961},{952},{963},
      {964},{965},{966},{967},{968},{969},{963},{945},{946},{947},{948},{949},{950},{951},{952},{953},{954},{955},{956},{957},
      {958},{959},{960},{961},{952},{963},{964},{965},{966},{967},{968},{969},{963},{945},{946},{947},{948},{949},{950},{951},
      {952},{953},{954},{955},{956},{957},{958},{959},{960},{961},{952},{963},{964},{965},{966},{967},{968},{969},{963},{945},
      {946},{947},{948},{949},{950},{951},{952},{953},{954},{955},{956},{957},{958},{959},{960},{961},{952},{963},{964},{965},
      {966},{967},{968},{969},{963},{945},{946},{947},{948},{949},{950},{951},{952},{953},{954},{955},{956},{957},{958},{959},
      {960},{961},{952},{963},{964},{965},{966},{967},{968},{969},{963}};

    
    public static final int[] B2(int c) {
      int i = java.util.Arrays.binarySearch(b2index,c);
      return i > -1 ? b2data[i] : null;
    }
    
    public static boolean isB1(int c) {
      return java.util.Arrays.binarySearch(B1,c) > -1;    
    }
    
    public static boolean isProhibited(int c) {
      if ((c & 0xFFFF) == 0xFFFF) return true;
      if ((c & 0xFFFE) == 0xFFFE) return true;
      return CharUtils.invset_contains(PROHIBITED, c);
    }
    
    
    public static boolean isRandAL(int c) {
      return CharUtils.invset_contains(RandAL, c);
    }
    
    public static boolean isLCat(int c) {
      return !CharUtils.invset_contains(notLCat, c);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy