/*
* Copyright 2014-15 Skynav, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY SKYNAV, INC. AND ITS CONTRIBUTORS “AS IS” AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL SKYNAV, INC. OR ITS CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.skynav.ttpe.util;
import java.util.Arrays;
public class Characters {
private Characters() {}
public static final int UC_HT = '\u0009'; // horizontal tab
public static final int UC_LF = '\n'; // line feed
public static final int UC_VT = '\u000B'; // vertical tab
public static final int UC_FF = '\u000C'; // form feed
public static final int UC_CR = '\r'; // carriage return
public static final int UC_SPACE = '\u0020'; // space
public static final int UC_HYPHEN_MINUS = '\u002D'; // hyphen-minus
public static final int UC_NBSP = '\u00A0'; // non-breaking space
public static final int UC_SOFT_HYPHEN = '\u00AD'; // soft hyphen
public static final int UC_SPACE_EN_QUAD = '\u2000'; // en quad
public static final int UC_SPACE_EM_QUAD = '\u2001'; // em quad
public static final int UC_SPACE_EN = '\u2002'; // en space
public static final int UC_SPACE_EM = '\u2003'; // em space
public static final int UC_SPACE_3_PER_EM = '\u2004'; // 3-per-em space
public static final int UC_SPACE_4_PER_EM = '\u2005'; // 4-per-em space
public static final int UC_SPACE_6_PER_EM = '\u2006'; // 6-per-em space
public static final int UC_SPACE_FIGURE = '\u2007'; // figure space
public static final int UC_SPACE_PUNCTUATION = '\u2008'; // punctuation space
public static final int UC_SPACE_THIN = '\u2009'; // thin space
public static final int UC_SPACE_HAIR = '\u200A'; // hair space
public static final int UC_SPACE_ZWSP = '\u200B'; // zero-width space
public static final int UC_ZWNJ = '\u200C'; // zero-width non-joiner
public static final int UC_ZWJ = '\u200D'; // zero-width joiner
public static final int UC_LRM = '\u200E'; // left-to-right mark
public static final int UC_RLM = '\u200F'; // right-to-left mark
public static final int UC_LINE_SEPARATOR = '\u2028'; // line separator
public static final int UC_PARA_SEPARATOR = '\u2029'; // paragraph separator
public static final int UC_LRE = '\u202A'; // left-to-right embedding
public static final int UC_RLE = '\u202B'; // right-to-left embedding
public static final int UC_PDF = '\u202C'; // pop directional formatting
public static final int UC_LRO = '\u202D'; // left-to-right override
public static final int UC_RLO = '\u202E'; // right-to-left override
public static final int UC_NNBSP = '\u202F'; // narrow non-breaking space
public static final int UC_MMSP = '\u205F'; // medium mathematical space
public static final int UC_LRI = '\u2066'; // left-to-right isolate
public static final int UC_RLI = '\u2067'; // right-to-left isolate
public static final int UC_PDI = '\u2069'; // pop directional isolate
public static final int UC_IDSP = '\u3000'; // ideographic space
public static final int UC_CJK_SYMBOL_START = '\u3000'; // cjk symbols - start
public static final int UC_CJK_SYMBOL_END = '\u303F'; // cjk symbols - end (inclusive)
public static final int UC_HIRAGANA_START = '\u3040'; // hiragana - start
public static final int UC_HIRAGANA_END = '\u309F'; // hiragana - end (inclusive)
public static final int UC_KATAKANA_START = '\u30A0'; // katakana - start
public static final int UC_KATAKANA_END = '\u30FF'; // katakana - end (inclusive)
public static final int UC_CJK_START = '\u4E00'; // unified cjk ideographs - start
public static final int UC_CJK_END = '\u9FCC'; // unified cjk ideographs - end (inclusive)
public static final int UC_CJK_VERTICAL_START = '\uFE10'; // cjk vertical forms - start
public static final int UC_CJK_VERTICAL_END = '\uFE1F'; // cjk vertical forms - end (inclusive)
public static final int UC_CJK_COMPAT_START = '\uFE30'; // cjk compatibility forms - start
public static final int UC_CJK_COMPAT_END = '\uFE4F'; // cjk compatibility forms - end (inclusive)
public static final int UC_CJK_HALF_FULL_WIDTH_START = '\uFF00'; // cjk half and full width forms - start
public static final int UC_CJK_HALF_FULL_WIDTH_END = '\uFFEF'; // cjk half and full width forms - end (inclusive)
public static final int UC_OBJECT = '\uFFFC'; // object replacement character
public static final int UC_REPLACEMENT = '\uFFFD'; // replacement character
public static final int UC_NOT_A_CHARACTER = '\uFFFF'; // not a character
public static String formatCharacter(int c) {
if (c < 65536)
return String.format("'%c' (U+%04X)", (char) c, c);
else if (c < 1114112)
return String.format("'%c' (U+%06X)", (char) c, c);
else
return String.format("*illegal character* (%08X)", c);
}
public static boolean isLineSeparator(int c) {
return c == UC_LINE_SEPARATOR;
}
public static boolean isBreakingWhitespace(int c) {
if (c == UC_HT)
return true;
else if (c == UC_LF)
return true;
else if (c == UC_VT)
return true;
else if (c == UC_FF)
return true;
else if (c == UC_CR)
return true;
else if (c == UC_SPACE)
return true;
else if ((c >= UC_SPACE_EN_QUAD) && (c <= UC_SPACE_ZWSP))
return true;
else if (c == UC_LINE_SEPARATOR)
return true;
else if (c == UC_MMSP)
return true;
else
return false;
}
public static boolean isNonBreakingWhitespace(int c) {
if (c == UC_NBSP)
return true;
else if (c == UC_NNBSP)
return true;
else
return false;
}
public static boolean isWhitespace(int c) {
return isBreakingWhitespace(c) || isNonBreakingWhitespace(c);
}
public static boolean isZeroWidthWhitespace(int c) {
if (c == UC_HT)
return true;
else if (c == UC_LF)
return true;
else if (c == UC_VT)
return true;
else if (c == UC_FF)
return true;
else if (c == UC_CR)
return true;
else if (c == UC_SPACE_ZWSP)
return true;
else if (c == UC_LINE_SEPARATOR)
return true;
else if (c == UC_PARA_SEPARATOR)
return true;
else
return false;
}
public static boolean isBidiControl(int c) {
if (c == UC_LRE)
return true;
else if (c == UC_RLE)
return true;
else if (c == UC_LRO)
return true;
else if (c == UC_RLO)
return true;
else if (c == UC_PDF)
return true;
else if (c == UC_LRI)
return true;
else if (c == UC_RLI)
return true;
else if (c == UC_PDI)
return true;
else
return false;
}
public static boolean isHyphenationPoint(int c) {
return (c == UC_HYPHEN_MINUS) || (c == UC_SOFT_HYPHEN);
}
public static boolean isNonSpacing(int c) {
if ((c >= 0x0300) && (c <= 0x036F))
return true;
else if ((c >= 0x0590) && (c <= 0x05CF))
return (c != 0x05C0) && (c != 0x05C6);
else if (((c >= 0x0610) && (c <= 0x061A)) || (c == 0x061C))
return true;
else if ((c >= 0x064B) && (c <= 0x065F))
return true;
else if ((c >= 0x06D6) && (c <= 0x06ED))
return (c != 0x06E5) && (c != 0x06E6) && (c != 0x06E9);
else if ((c >= 0x1AB0) && (c <= 0x1AFF))
return true;
else if ((c >= 0x1DC0) && (c <= 0x1DFF))
return true;
else if ((c >= 0x2000) && (c <= 0x200F))
return true;
else if ((c >= 0x2028) && (c <= 0x202F))
return true;
else if ((c >= 0x205F) && (c <= 0x206F))
return true;
else
return false;
}
public static boolean isCJKSymbol(int c) {
return (c >= UC_CJK_SYMBOL_START) && (c <= UC_CJK_SYMBOL_END);
}
public static boolean isCJKIdeograph(int c) {
return (c >= UC_CJK_START) && (c <= UC_CJK_END);
}
public static boolean isCJKVertical(int c) {
return (c >= UC_CJK_VERTICAL_START) && (c <= UC_CJK_VERTICAL_END);
}
public static boolean isCJKCompatibility(int c) {
return (c >= UC_CJK_COMPAT_START) && (c <= UC_CJK_COMPAT_END);
}
public static boolean isCJKHalfFullWidth(int c) {
return (c >= UC_CJK_HALF_FULL_WIDTH_START) && (c <= UC_CJK_HALF_FULL_WIDTH_END);
}
public static boolean isHiragana(int c) {
return (c >= UC_HIRAGANA_START) && (c <= UC_HIRAGANA_END);
}
public static boolean isKatakana(int c) {
return (c >= UC_KATAKANA_START) && (c <= UC_KATAKANA_END);
}
public static boolean isCJK(int c) {
if (isCJKSymbol(c))
return true;
else if (isHiragana(c))
return true;
else if (isKatakana(c))
return true;
else if (isCJKIdeograph(c))
return true;
else if (isCJKVertical(c))
return true;
else if (isCJKCompatibility(c))
return true;
else if (isCJKHalfFullWidth(c))
return true;
else
return false;
}
// UTR #50 - Unicode Vertical Text Layout
public enum VerticalOrientation {
U, // displayed upright, same orientation as in code charts
R, // displayed sideways, rotated 90 from orientation in code charts
Tu, // mapped to vertical glyph variant, or if unavailable, same orientation as in code charts
Tr; // mapped to vertical glyph variant, or if unavailable, same rotated 90 from orientation in code charts
};
private static final VerticalOrientation[] verticalOrientations = new VerticalOrientation[] {
VerticalOrientation.U,
VerticalOrientation.R,
VerticalOrientation.Tu,
VerticalOrientation.Tr
};
private static final int[] voRanges1 = new int[] {
0x0000, 0x00A6, // 0000..00A6 ; R
0x00AA, 0x00AD, // 00AA..00AD ; R
0x00AF, 0x00B0, // 00AF..00B0 ; R
0x00B2, 0x00BB, // 00B2..00BB ; R
0x00BC, 0x00BE, // 00BC..00BE ; U
0x00BF, 0x00D6, // 00BF..00D6 ; R
0x00D8, 0x00F6, // 00D8..00F6 ; R
0x00F8, 0x02E9, // 00F8..02E9 ; R
0x02EA, 0x02EB, // 02EA..02EB ; U
0x02EC, 0x10FF, // 02EC..10FF ; R
0x1100, 0x11FF, // 1100..11FF ; U
0x1200, 0x1400, // 1200..1400 ; R
0x1401, 0x167F, // 1401..167F ; U
0x1680, 0x18AF, // 1680..18AF ; R
0x18B0, 0x18FF, // 18B0..18FF ; U
0x1900, 0x2015, // 1900..2015 ; R
0x2017, 0x201F, // 2017..201F ; R
0x2020, 0x2021, // 2020..2021 ; U
0x2022, 0x2025, // 2022..2025 ; R // temporarily subdivide 2022..202F to change 2026 to Tr
0x2027, 0x202F, // 2027..202F ; R // temporarily subdivide 2022..202F to change 2026 to Tr
0x2030, 0x2031, // 2030..2031 ; U
0x2032, 0x203A, // 2032..203A ; R
0x203B, 0x203C, // 203B..203C ; U
0x203D, 0x2041, // 203D..2041 ; R
0x2043, 0x2046, // 2043..2046 ; R
0x2047, 0x2049, // 2047..2049 ; U
0x204A, 0x2050, // 204A..2050 ; R
0x2052, 0x2064, // 2052..2064 ; R
0x2066, 0x20DC, // 2066..20DC ; R
0x20DD, 0x20E0, // 20DD..20E0 ; U
0x20E2, 0x20E4, // 20E2..20E4 ; U
0x20E5, 0x20FF, // 20E5..20FF ; R
0x2100, 0x2101, // 2100..2101 ; U
0x2103, 0x2109, // 2103..2109 ; U
0x210A, 0x210E, // 210A..210E ; R
0x2110, 0x2112, // 2110..2112 ; R
0x2113, 0x2114, // 2113..2114 ; U
0x2116, 0x2117, // 2116..2117 ; U
0x2118, 0x211D, // 2118..211D ; R
0x211E, 0x2123, // 211E..2123 ; U
0x212A, 0x212D, // 212A..212D ; R
0x212F, 0x2134, // 212F..2134 ; R
0x2135, 0x213F, // 2135..213F ; U
0x2140, 0x2144, // 2140..2144 ; R
0x2145, 0x214A, // 2145..214A ; U
0x214C, 0x214D, // 214C..214D ; U
0x214F, 0x218F, // 214F..218F ; U
0x2190, 0x221D, // 2190..221D ; R
0x221F, 0x2233, // 221F..2233 ; R
0x2234, 0x2235, // 2234..2235 ; U
0x2236, 0x22FF, // 2236..22FF ; R
0x2300, 0x2307, // 2300..2307 ; U
0x230C, 0x231F, // 230C..231F ; U
0x2320, 0x2323, // 2320..2323 ; R
0x2324, 0x2328, // 2324..2328 ; U
0x2329, 0x232A, // 2329..232A ; Tr
0x232C, 0x237C, // 232C..237C ; R
0x237D, 0x239A, // 237D..239A ; U
0x239B, 0x23BD, // 239B..23BD ; R
0x23BE, 0x23CD, // 23BE..23CD ; U
0x23D1, 0x23DB, // 23D1..23DB ; U
0x23DC, 0x23E1, // 23DC..23E1 ; R
0x23E2, 0x2422, // 23E2..2422 ; U
0x2424, 0x24FF, // 2424..24FF ; U
0x2500, 0x259F, // 2500..259F ; R
0x25A0, 0x2619, // 25A0..2619 ; U
0x261A, 0x261F, // 261A..261F ; R
0x2620, 0x2767, // 2620..2767 ; U
0x2768, 0x2775, // 2768..2775 ; R
0x2776, 0x2793, // 2776..2793 ; U
0x2794, 0x2B11, // 2794..2B11 ; R
0x2B12, 0x2B2F, // 2B12..2B2F ; U
0x2B30, 0x2B4F, // 2B30..2B4F ; R
0x2B50, 0x2B59, // 2B50..2B59 ; U
0x2B5A, 0x2BB7, // 2B5A..2BB7 ; R
0x2BB8, 0x2BFF, // 2BB8..2BFF ; U
0x2C00, 0x2E7F, // 2C00..2E7F ; R
0x2E80, 0x3000, // 2E80..3000 ; U
0x3001, 0x3002, // 3001..3002 ; Tu
0x3003, 0x3007, // 3003..3007 ; U
0x3008, 0x3011, // 3008..3011 ; Tr
0x3012, 0x3013, // 3012..3013 ; U
0x3014, 0x301F, // 3014..301F ; Tr
0x3020, 0x302F, // 3020..302F ; U
0x3031, 0x3040, // 3031..3040 ; U
0x304A, 0x3062, // 304A..3062 ; U
0x3064, 0x3082, // 3064..3082 ; U
0x3088, 0x308D, // 3088..308D ; U
0x308F, 0x3094, // 308F..3094 ; U
0x3095, 0x3096, // 3095..3096 ; Tu
0x3097, 0x309A, // 3097..309A ; U
0x309B, 0x309C, // 309B..309C ; Tu
0x309D, 0x309F, // 309D..309F ; U
0x30AA, 0x30C2, // 30AA..30C2 ; U
0x30C4, 0x30E2, // 30C4..30E2 ; U
0x30E8, 0x30ED, // 30E8..30ED ; U
0x30EF, 0x30F4, // 30EF..30F4 ; U
0x30F5, 0x30F6, // 30F5..30F6 ; Tu
0x30F7, 0x30FB, // 30F7..30FB ; U
0x30FD, 0x3126, // 30FD..3126 ; U
0x3128, 0x31EF, // 3128..31EF ; U
0x31F0, 0x31FF, // 31F0..31FF ; Tu
0x3200, 0x32FF, // 3200..32FF ; U
0x3300, 0x3357, // 3300..3357 ; Tu
0x3358, 0x337A, // 3358..337A ; U
0x337B, 0x337F, // 337B..337F ; Tu
0x3380, 0xA4CF, // 3380..A4CF ; U
0x3400, 0x4DBF, // 3400..4DBF ; U
0xA4D0, 0xA95F, // A4D0..A95F ; R
0xA960, 0xA97F, // A960..A97F ; U
0xA980, 0xABFF, // A980..ABFF ; R
0xAC00, 0xD7FF, // AC00..D7FF ; U
0xD800, 0xDFFF, // D800..DFFF ; R
0xE000, 0xFAFF, // E000..FAFF ; U
0xFB00, 0xFE0F, // FB00..FE0F ; R
0xFE10, 0xFE1F, // FE10..FE1F ; U
0xFE20, 0xFE2F, // FE20..FE2F ; R
0xFE30, 0xFE48, // FE30..FE48 ; U
0xFE49, 0xFE4F, // FE49..FE4F ; R
0xFE50, 0xFE52, // FE50..FE52 ; Tu
0xFE53, 0xFE57, // FE53..FE57 ; U
0xFE59, 0xFE5E, // FE59..FE5E ; Tr
0xFE5F, 0xFE62, // FE5F..FE62 ; U
0xFE63, 0xFE66, // FE63..FE66 ; R
0xFE67, 0xFE6F, // FE67..FE6F ; U
0xFE70, 0xFF00, // FE70..FF00 ; R
0xFF02, 0xFF07, // FF02..FF07 ; U
0xFF08, 0xFF09, // FF08..FF09 ; Tr
0xFF0A, 0xFF0B, // FF0A..FF0B ; U
0xFF0F, 0xFF19, // FF0F..FF19 ; U
0xFF1A, 0xFF1B, // FF1A..FF1B ; Tr
0xFF1C, 0xFF1E, // FF1C..FF1E ; R
0xFF20, 0xFF3A, // FF20..FF3A ; U
0xFF40, 0xFF5A, // FF40..FF5A ; U
0xFF5B, 0xFF60, // FF5B..FF60 ; Tr
0xFF61, 0xFFDF, // FF61..FFDF ; R
0xFFE0, 0xFFE2, // FFE0..FFE2 ; U
0xFFE4, 0xFFE7, // FFE4..FFE7 ; U
0xFFE8, 0xFFEF, // FFE8..FFEF ; R
0xFFF0, 0xFFF8, // FFF0..FFF8 ; U
0xFFF9, 0xFFFB, // FFF9..FFFB ; R
0xFFFC, 0xFFFD, // FFFC..FFFD ; U
0xFFFE, 0xFFFF // FFFE..FFFF ; R
};
private static final byte[] voRanges1Values = new byte[] {
1, // 0000..00A6 ; R
1, // 00AA..00AD ; R
1, // 00AF..00B0 ; R
1, // 00B2..00BB ; R
0, // 00BC..00BE ; U
1, // 00BF..00D6 ; R
1, // 00D8..00F6 ; R
1, // 00F8..02E9 ; R
0, // 02EA..02EB ; U
1, // 02EC..10FF ; R
0, // 1100..11FF ; U
1, // 1200..1400 ; R
0, // 1401..167F ; U
1, // 1680..18AF ; R
0, // 18B0..18FF ; U
1, // 1900..2015 ; R
1, // 2017..201F ; R
0, // 2020..2021 ; U
1, // 2022..2025 ; R
1, // 2027..202F ; R
0, // 2030..2031 ; U
1, // 2032..203A ; R
0, // 203B..203C ; U
1, // 203D..2041 ; R
1, // 2043..2046 ; R
0, // 2047..2049 ; U
1, // 204A..2050 ; R
1, // 2052..2064 ; R
1, // 2066..20DC ; R
0, // 20DD..20E0 ; U
0, // 20E2..20E4 ; U
1, // 20E5..20FF ; R
0, // 2100..2101 ; U
0, // 2103..2109 ; U
1, // 210A..210E ; R
1, // 2110..2112 ; R
0, // 2113..2114 ; U
0, // 2116..2117 ; U
1, // 2118..211D ; R
0, // 211E..2123 ; U
1, // 212A..212D ; R
1, // 212F..2134 ; R
0, // 2135..213F ; U
1, // 2140..2144 ; R
0, // 2145..214A ; U
0, // 214C..214D ; U
0, // 214F..218F ; U
1, // 2190..221D ; R
1, // 221F..2233 ; R
0, // 2234..2235 ; U
1, // 2236..22FF ; R
0, // 2300..2307 ; U
0, // 230C..231F ; U
1, // 2320..2323 ; R
0, // 2324..2328 ; U
3, // 2329..232A ; Tr
1, // 232C..237C ; R
0, // 237D..239A ; U
1, // 239B..23BD ; R
0, // 23BE..23CD ; U
0, // 23D1..23DB ; U
1, // 23DC..23E1 ; R
0, // 23E2..2422 ; U
0, // 2424..24FF ; U
1, // 2500..259F ; R
0, // 25A0..2619 ; U
1, // 261A..261F ; R
0, // 2620..2767 ; U
1, // 2768..2775 ; R
0, // 2776..2793 ; U
1, // 2794..2B11 ; R
0, // 2B12..2B2F ; U
1, // 2B30..2B4F ; R
0, // 2B50..2B59 ; U
1, // 2B5A..2BB7 ; R
0, // 2BB8..2BFF ; U
1, // 2C00..2E7F ; R
0, // 2E80..3000 ; U
2, // 3001..3002 ; Tu
0, // 3003..3007 ; U
3, // 3008..3011 ; Tr
0, // 3012..3013 ; U
3, // 3014..301F ; Tr
0, // 3020..302F ; U
0, // 3031..3040 ; U
0, // 304A..3062 ; U
0, // 3064..3082 ; U
0, // 3088..308D ; U
0, // 308F..3094 ; U
2, // 3095..3096 ; Tu
0, // 3097..309A ; U
2, // 309B..309C ; Tu
0, // 309D..309F ; U
0, // 30AA..30C2 ; U
0, // 30C4..30E2 ; U
0, // 30E8..30ED ; U
0, // 30EF..30F4 ; U
2, // 30F5..30F6 ; Tu
0, // 30F7..30FB ; U
0, // 30FD..3126 ; U
0, // 3128..31EF ; U
2, // 31F0..31FF ; Tu
0, // 3200..32FF ; U
2, // 3300..3357 ; Tu
0, // 3358..337A ; U
2, // 337B..337F ; Tu
0, // 3380..A4CF ; U
0, // 3400..4DBF ; U
1, // A4D0..A95F ; R
0, // A960..A97F ; U
1, // A980..ABFF ; R
0, // AC00..D7FF ; U
1, // D800..DFFF ; R
0, // E000..FAFF ; U
1, // FB00..FE0F ; R
0, // FE10..FE1F ; U
1, // FE20..FE2F ; R
0, // FE30..FE48 ; U
1, // FE49..FE4F ; R
2, // FE50..FE52 ; Tu
0, // FE53..FE57 ; U
3, // FE59..FE5E ; Tr
0, // FE5F..FE62 ; U
1, // FE63..FE66 ; R
0, // FE67..FE6F ; U
1, // FE70..FF00 ; R
0, // FF02..FF07 ; U
3, // FF08..FF09 ; Tr
0, // FF0A..FF0B ; U
0, // FF0F..FF19 ; U
3, // FF1A..FF1B ; Tr
1, // FF1C..FF1E ; R
0, // FF20..FF3A ; U
0, // FF40..FF5A ; U
3, // FF5B..FF60 ; Tr
1, // FF61..FFDF ; R
0, // FFE0..FFE2 ; U
0, // FFE4..FFE7 ; U
1, // FFE8..FFEF ; R
0, // FFF0..FFF8 ; U
1, // FFF9..FFFB ; R
0, // FFFC..FFFD ; U
1 // FFFE..FFFF ; R
};
private static final int[] voSingles1 = new int[] {
0x2016, // 2016..2016 ; U
0x2026, // 2016..2016 ; Tr
0x3030, // 3030..3030 ; Tr
0x3041, // 3041..3041 ; Tu
0x3042, // 3042..3042 ; U
0x3043, // 3043..3043 ; Tu
0x3044, // 3044..3044 ; U
0x3045, // 3045..3045 ; Tu
0x3046, // 3046..3046 ; U
0x3047, // 3047..3047 ; Tu
0x3048, // 3048..3048 ; U
0x3049, // 3049..3049 ; Tu
0x3063, // 3063..3063 ; Tu
0x3083, // 3083..3083 ; Tu
0x3084, // 3084..3084 ; U
0x3085, // 3085..3085 ; Tu
0x3086, // 3086..3086 ; U
0x3087, // 3087..3087 ; Tu
0x308E, // 308E..308E ; Tu
0x30A0, // 30A0..30A0 ; Tr
0x30A1, // 30A1..30A1 ; Tu
0x30A2, // 30A2..30A2 ; U
0x30A3, // 30A3..30A3 ; Tu
0x30A4, // 30A4..30A4 ; U
0x30A5, // 30A5..30A5 ; Tu
0x30A6, // 30A6..30A6 ; U
0x30A7, // 30A7..30A7 ; Tu
0x30A8, // 30A8..30A8 ; U
0x30A9, // 30A9..30A9 ; Tu
0x30C3, // 30C3..30C3 ; Tu
0x30E3, // 30E3..30E3 ; Tu
0x30E4, // 30E4..30E4 ; U
0x30E5, // 30E5..30E5 ; Tu
0x30E6, // 30E6..30E6 ; U
0x30E7, // 30E7..30E7 ; Tu
0x30EE, // 30EE..30EE ; Tu
0x30FC, // 30FC..30FC ; Tr
0x3127, // 3127..3127 ; Tu
0xFE58, // FE58..FE58 ; R
0xFF01, // FF01..FF01 ; Tu
0xFF0C, // FF0C..FF0C ; Tu
0xFF0D, // FF0D..FF0D ; R
0xFF0E, // FF0E..FF0E ; Tu
0xFF1F, // FF1F..FF1F ; Tu
0xFF3B, // FF3B..FF3B ; Tr
0xFF3C, // FF3C..FF3C ; U
0xFF3D, // FF3D..FF3D ; Tr
0xFF3E, // FF3E..FF3E ; U
0xFF3F, // FF3F..FF3F ; Tr
0xFFE3 // FFE3..FFE3 ; Tr
};
private static final byte[] voSingles1Values = new byte[] {
3, // 2016..2016 ; Tr
3, // 2026..2026 ; Tr
3, // 3030..3030 ; Tr
2, // 3041..3041 ; Tu
0, // 3042..3042 ; U
2, // 3043..3043 ; Tu
0, // 3044..3044 ; U
2, // 3045..3045 ; Tu
0, // 3046..3046 ; U
2, // 3047..3047 ; Tu
0, // 3048..3048 ; U
2, // 3049..3049 ; Tu
2, // 3063..3063 ; Tu
2, // 3083..3083 ; Tu
0, // 3084..3084 ; U
2, // 3085..3085 ; Tu
0, // 3086..3086 ; U
2, // 3087..3087 ; Tu
2, // 308E..308E ; Tu
3, // 30A0..30A0 ; Tr
2, // 30A1..30A1 ; Tu
0, // 30A2..30A2 ; U
2, // 30A3..30A3 ; Tu
0, // 30A4..30A4 ; U
2, // 30A5..30A5 ; Tu
0, // 30A6..30A6 ; U
2, // 30A7..30A7 ; Tu
0, // 30A8..30A8 ; U
2, // 30A9..30A9 ; Tu
2, // 30C3..30C3 ; Tu
2, // 30E3..30E3 ; Tu
0, // 30E4..30E4 ; U
2, // 30E5..30E5 ; Tu
0, // 30E6..30E6 ; U
2, // 30E7..30E7 ; Tu
2, // 30EE..30EE ; Tu
3, // 30FC..30FC ; Tr
2, // 3127..3127 ; Tu
1, // FE58..FE58 ; R
2, // FF01..FF01 ; Tu
2, // FF0C..FF0C ; Tu
1, // FF0D..FF0D ; R
2, // FF0E..FF0E ; Tu
2, // FF1F..FF1F ; Tu
3, // FF3B..FF3B ; Tr
0, // FF3C..FF3C ; U
3, // FF3D..FF3D ; Tr
0, // FF3E..FF3E ; U
3, // FF3F..FF3F ; Tr
3 // FFE3..FFE3 ; Tr
};
public static VerticalOrientation getVerticalOrientation(int c) {
VerticalOrientation vo;
vo = lookupOrientationInRange0(c);
if (vo != null)
return vo;
vo = lookupOrientationInRanges(c);
if (vo != null)
return vo;
vo = lookupOrientationInSingles(c);
if (vo != null)
return vo;
return VerticalOrientation.U;
}
private static VerticalOrientation lookupOrientationInRange0(int c) {
assert voRanges1.length >= 2;
assert voRanges1Values.length >= 1;
int c0 = voRanges1[0];
int c1 = voRanges1[1];
return ((c >= c0) && (c <= c1)) ? verticalOrientations[voRanges1Values[0]] : null;
}
private static VerticalOrientation lookupOrientationInRanges(int c) {
int n = voRanges1.length / 2;
if (n > 0) {
for (int f = 0, t = n; f <= t; ) {
int m = (f + t) / 2;
int i = 2 * m;
int c0 = voRanges1[i + 0];
int c1 = voRanges1[i + 1];
if (c1 < c) {
if ((f = m + 1) > n)
break;
} else if (c0 > c) {
if ((t = m - 1) < 0)
break;
} else
return verticalOrientations[voRanges1Values[m]];
}
}
return null;
}
private static VerticalOrientation lookupOrientationInSingles(int c) {
int n = voSingles1.length;
if (n > 0) {
for (int f = 0, t = n; f <= t; ) {
int m = (f + t) >>> 1;
int c0 = voSingles1[m];
if (c0 < c) {
if ((f = m + 1) > n)
break;
} else if (c0 > c) {
if ((t = m - 1) < 0)
break;
} else
return verticalOrientations[voSingles1Values[m]];
}
}
return null;
}
public static boolean isUprightOrientation(int c) {
VerticalOrientation vo = getVerticalOrientation(c);
if (vo == VerticalOrientation.U)
return true;
else if (vo == VerticalOrientation.Tu)
return true;
else if (vo == VerticalOrientation.Tr) {
// TBD - should return false if font doesn't have a Tr mapping, but we don't have a font binding here; so just assume it does have a mapping;
// if it doesn't have one, then will get an upright glyph when we want a rotated glyph
return true;
} else
return false;
}
private static final int[] h2fKey = new int[] {
0x0021,
0x0022,
0x0023,
0x0024,
0x0025,
0x0026,
0x0027,
0x0028,
0x0029,
0x002A,
0x002B,
0x002C,
0x002D,
0x002E,
0x002F,
0x0030,
0x0031,
0x0032,
0x0033,
0x0034,
0x0035,
0x0036,
0x0037,
0x0038,
0x0039,
0x003A,
0x003B,
0x003C,
0x003D,
0x003E,
0x003F,
0x0040,
0x0041,
0x0042,
0x0043,
0x0044,
0x0045,
0x0046,
0x0047,
0x0048,
0x0049,
0x004A,
0x004B,
0x004C,
0x004D,
0x004E,
0x004F,
0x0050,
0x0051,
0x0052,
0x0053,
0x0054,
0x0055,
0x0056,
0x0057,
0x0058,
0x0059,
0x005A,
0x005B,
0x005C,
0x005D,
0x005E,
0x005F,
0x0060,
0x0061,
0x0062,
0x0063,
0x0064,
0x0065,
0x0066,
0x0067,
0x0068,
0x0069,
0x006A,
0x006B,
0x006C,
0x006D,
0x006E,
0x006F,
0x0070,
0x0071,
0x0072,
0x0073,
0x0074,
0x0075,
0x0076,
0x0077,
0x0078,
0x0079,
0x007A,
0x007B,
0x007C,
0x007D,
0x007E,
0x00A2,
0x00A3,
0x00A5,
0x00A6,
0x00AC,
0x00AF,
0x20A9,
0x2985,
0x2986,
0x3001,
0x3002,
0x300C,
0x300D,
0xFF65,
0xFF66,
0xFF67,
0xFF68,
0xFF69,
0xFF6A,
0xFF6B,
0xFF6C,
0xFF6D,
0xFF6E,
0xFF6F,
0xFF70,
0xFF71,
0xFF72,
0xFF73,
0xFF74,
0xFF75,
0xFF76,
0xFF77,
0xFF78,
0xFF79,
0xFF7A,
0xFF7B,
0xFF7C,
0xFF7D,
0xFF7E,
0xFF7F,
0xFF80,
0xFF81,
0xFF82,
0xFF83,
0xFF84,
0xFF85,
0xFF86,
0xFF87,
0xFF88,
0xFF89,
0xFF8A,
0xFF8B,
0xFF8C,
0xFF8D,
0xFF8E,
0xFF8F,
0xFF90,
0xFF91,
0xFF92,
0xFF93,
0xFF94,
0xFF95,
0xFF96,
0xFF97,
0xFF98,
0xFF99,
0xFF9A,
0xFF9B,
0xFF9C,
0xFF9D,
0xFF9E,
0xFF9F,
0xFFE8,
0xFFE9,
0xFFEA,
0xFFEB,
0xFFEC,
0xFFED,
0xFFEE
};
private static final int[] h2fVal = new int[] {
0xFF01,
0xFF02,
0xFF03,
0xFF04,
0xFF05,
0xFF06,
0xFF07,
0xFF08,
0xFF09,
0xFF0A,
0xFF0B,
0xFF0C,
0xFF0D,
0xFF0E,
0xFF0F,
0xFF10,
0xFF11,
0xFF12,
0xFF13,
0xFF14,
0xFF15,
0xFF16,
0xFF17,
0xFF18,
0xFF19,
0xFF1A,
0xFF1B,
0xFF1C,
0xFF1D,
0xFF1E,
0xFF1F,
0xFF20,
0xFF21,
0xFF22,
0xFF23,
0xFF24,
0xFF25,
0xFF26,
0xFF27,
0xFF28,
0xFF29,
0xFF2A,
0xFF2B,
0xFF2C,
0xFF2D,
0xFF2E,
0xFF2F,
0xFF30,
0xFF31,
0xFF32,
0xFF33,
0xFF34,
0xFF35,
0xFF36,
0xFF37,
0xFF38,
0xFF39,
0xFF3A,
0xFF3B,
0xFF3C,
0xFF3D,
0xFF3E,
0xFF3F,
0xFF40,
0xFF41,
0xFF42,
0xFF43,
0xFF44,
0xFF45,
0xFF46,
0xFF47,
0xFF48,
0xFF49,
0xFF4A,
0xFF4B,
0xFF4C,
0xFF4D,
0xFF4E,
0xFF4F,
0xFF50,
0xFF51,
0xFF52,
0xFF53,
0xFF54,
0xFF55,
0xFF56,
0xFF57,
0xFF58,
0xFF59,
0xFF5A,
0xFF5B,
0xFF5C,
0xFF5D,
0xFF5E,
0xFFE0,
0xFFE1,
0xFFE5,
0xFFE4,
0xFFE2,
0xFFE3,
0xFFE6,
0xFF5F,
0xFF60,
0xFF64,
0xFF61,
0xFF62,
0xFF63,
0x30FB,
0x30F2,
0x30A1,
0x30A3,
0x30A5,
0x30A7,
0x30A9,
0x30E3,
0x30E5,
0x30E7,
0x30C3,
0x30FC,
0x30A2,
0x30A4,
0x30A6,
0x30A8,
0x30AA,
0x30AB,
0x30AD,
0x30AF,
0x30B1,
0x30B3,
0x30B5,
0x30B7,
0x30B9,
0x30BB,
0x30BD,
0x30BF,
0x30C1,
0x30C4,
0x30C6,
0x30C8,
0x30CA,
0x30CB,
0x30CC,
0x30CD,
0x30CE,
0x30CF,
0x30D2,
0x30D5,
0x30D8,
0x30DB,
0x30DE,
0x30DF,
0x30E0,
0x30E1,
0x30E2,
0x30E4,
0x30E6,
0x30E8,
0x30E9,
0x30EA,
0x30EB,
0x30EC,
0x30ED,
0x30EF,
0x30F3,
0x3099,
0x309A,
0x2502,
0x2190,
0x2191,
0x2192,
0x2193,
0X25A0,
0x25CB
};
private static final int[] f2hKey = new int[] {
0x25A0,
0x2190,
0x2191,
0x2192,
0x2193,
0x2502,
0x25CB,
0x3099,
0x309A,
0x30A1,
0x30A2,
0x30A3,
0x30A4,
0x30A5,
0x30A6,
0x30A7,
0x30A8,
0x30A9,
0x30AA,
0x30AB,
0x30AD,
0x30AF,
0x30B1,
0x30B3,
0x30B5,
0x30B7,
0x30B9,
0x30BB,
0x30BD,
0x30BF,
0x30C1,
0x30C3,
0x30C4,
0x30C6,
0x30C8,
0x30CA,
0x30CB,
0x30CC,
0x30CD,
0x30CE,
0x30CF,
0x30D2,
0x30D5,
0x30D8,
0x30DB,
0x30DE,
0x30DF,
0x30E0,
0x30E1,
0x30E2,
0x30E3,
0x30E4,
0x30E5,
0x30E6,
0x30E7,
0x30E8,
0x30E9,
0x30EA,
0x30EB,
0x30EC,
0x30ED,
0x30EF,
0x30F2,
0x30F3,
0x30FB,
0x30FC,
0xFF01,
0xFF02,
0xFF03,
0xFF04,
0xFF05,
0xFF06,
0xFF07,
0xFF08,
0xFF09,
0xFF0A,
0xFF0B,
0xFF0C,
0xFF0D,
0xFF0E,
0xFF0F,
0xFF10,
0xFF11,
0xFF12,
0xFF13,
0xFF14,
0xFF15,
0xFF16,
0xFF17,
0xFF18,
0xFF19,
0xFF1A,
0xFF1B,
0xFF1C,
0xFF1D,
0xFF1E,
0xFF1F,
0xFF20,
0xFF21,
0xFF22,
0xFF23,
0xFF24,
0xFF25,
0xFF26,
0xFF27,
0xFF28,
0xFF29,
0xFF2A,
0xFF2B,
0xFF2C,
0xFF2D,
0xFF2E,
0xFF2F,
0xFF30,
0xFF31,
0xFF32,
0xFF33,
0xFF34,
0xFF35,
0xFF36,
0xFF37,
0xFF38,
0xFF39,
0xFF3A,
0xFF3B,
0xFF3C,
0xFF3D,
0xFF3E,
0xFF3F,
0xFF40,
0xFF41,
0xFF42,
0xFF43,
0xFF44,
0xFF45,
0xFF46,
0xFF47,
0xFF48,
0xFF49,
0xFF4A,
0xFF4B,
0xFF4C,
0xFF4D,
0xFF4E,
0xFF4F,
0xFF50,
0xFF51,
0xFF52,
0xFF53,
0xFF54,
0xFF55,
0xFF56,
0xFF57,
0xFF58,
0xFF59,
0xFF5A,
0xFF5B,
0xFF5C,
0xFF5D,
0xFF5E,
0xFF5F,
0xFF60,
0xFF61,
0xFF62,
0xFF63,
0xFF64,
0xFFE0,
0xFFE1,
0xFFE2,
0xFFE3,
0xFFE4,
0xFFE5,
0xFFE6
};
private static final int[] f2hVal = new int[] {
0xFFED,
0xFFE9,
0xFFEA,
0xFFEB,
0xFFEC,
0xFFE8,
0xFFEE,
0xFF9E,
0xFF9F,
0xFF67,
0xFF71,
0xFF68,
0xFF72,
0xFF69,
0xFF73,
0xFF6A,
0xFF74,
0xFF6B,
0xFF75,
0xFF76,
0xFF77,
0xFF78,
0xFF79,
0xFF7A,
0xFF7B,
0xFF7C,
0xFF7D,
0xFF7E,
0xFF7F,
0xFF80,
0xFF81,
0xFF6F,
0xFF82,
0xFF83,
0xFF84,
0xFF85,
0xFF86,
0xFF87,
0xFF88,
0xFF89,
0xFF8A,
0xFF8B,
0xFF8C,
0xFF8D,
0xFF8E,
0xFF8F,
0xFF90,
0xFF91,
0xFF92,
0xFF93,
0xFF6C,
0xFF94,
0xFF6D,
0xFF95,
0xFF6E,
0xFF96,
0xFF97,
0xFF98,
0xFF99,
0xFF9A,
0xFF9B,
0xFF9C,
0xFF66,
0xFF9D,
0xFF65,
0xFF70,
0x0021,
0x0022,
0x0023,
0x0024,
0x0025,
0x0026,
0x0027,
0x0028,
0x0029,
0x002A,
0x002B,
0x002C,
0x002D,
0x002E,
0x002F,
0x0030,
0x0031,
0x0032,
0x0033,
0x0034,
0x0035,
0x0036,
0x0037,
0x0038,
0x0039,
0x003A,
0x003B,
0x003C,
0x003D,
0x003E,
0x003F,
0x0040,
0x0041,
0x0042,
0x0043,
0x0044,
0x0045,
0x0046,
0x0047,
0x0048,
0x0049,
0x004A,
0x004B,
0x004C,
0x004D,
0x004E,
0x004F,
0x0050,
0x0051,
0x0052,
0x0053,
0x0054,
0x0055,
0x0056,
0x0057,
0x0058,
0x0059,
0x005A,
0x005B,
0x005C,
0x005D,
0x005E,
0x005F,
0x0060,
0x0061,
0x0062,
0x0063,
0x0064,
0x0065,
0x0066,
0x0067,
0x0068,
0x0069,
0x006A,
0x006B,
0x006C,
0x006D,
0x006E,
0x006F,
0x0070,
0x0071,
0x0072,
0x0073,
0x0074,
0x0075,
0x0076,
0x0077,
0x0078,
0x0079,
0x007A,
0x007B,
0x007C,
0x007D,
0x007E,
0x2985,
0x2986,
0x3002,
0x300C,
0x300D,
0x3001,
0x00A2,
0x00A3,
0x00AC,
0x00AF,
0x00A6,
0x00A5,
0x20A9
};
public static boolean hasHalfWidth(int c) {
return Arrays.binarySearch(f2hKey, c) >= 0;
}
public static int toHalfWidth(int c) {
int k = Arrays.binarySearch(f2hKey, c);
if (k >= 0)
return f2hVal[k];
else
return c;
}
public static boolean hasFullWidth(int c) {
return Arrays.binarySearch(h2fKey, c) >= 0;
}
public static int toFullWidth(int c) {
int k = Arrays.binarySearch(h2fKey, c);
if (k >= 0)
return h2fVal[k];
else
return c;
}
private static final int[] h2vKey = new int[] {
0x2026
};
private static final int[] h2vVal = new int[] {
0xFE19
};
public static boolean hasVertical(int c) {
return Arrays.binarySearch(h2vKey, c) >= 0;
}
public static int toVertical(int c) {
int k = Arrays.binarySearch(h2vKey, c);
if (k >= 0)
return h2vVal[k];
else
return c;
}
private static final int[] mirKey = new int[] {
0x0028, // LEFT PARENTHESIS
0x0029, // RIGHT PARENTHESIS
0x003C, // LESS-THAN SIGN
0x003E, // GREATER-THAN SIGN
0x005B, // LEFT SQUARE BRACKET
0x005D, // RIGHT SQUARE BRACKET
0x007B, // LEFT CURLY BRACKET
0x007D, // RIGHT CURLY BRACKET
0x00AB, // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0x00BB, // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0x0F3A, // TIBETAN MARK GUG RTAGS GYON
0x0F3B, // TIBETAN MARK GUG RTAGS GYAS
0x0F3C, // TIBETAN MARK ANG KHANG GYON
0x0F3D, // TIBETAN MARK ANG KHANG GYAS
0x169B, // OGHAM FEATHER MARK
0x169C, // OGHAM REVERSED FEATHER MARK
0x2039, // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x203A, // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x2045, // LEFT SQUARE BRACKET WITH QUILL
0x2046, // RIGHT SQUARE BRACKET WITH QUILL
0x207D, // SUPERSCRIPT LEFT PARENTHESIS
0x207E, // SUPERSCRIPT RIGHT PARENTHESIS
0x208D, // SUBSCRIPT LEFT PARENTHESIS
0x208E, // SUBSCRIPT RIGHT PARENTHESIS
0x2208, // ELEMENT OF
0x2209, // NOT AN ELEMENT OF
0x220A, // SMALL ELEMENT OF
0x220B, // CONTAINS AS MEMBER
0x220C, // DOES NOT CONTAIN AS MEMBER
0x220D, // SMALL CONTAINS AS MEMBER
0x2215, // DIVISION SLASH
0x223C, // TILDE OPERATOR
0x223D, // REVERSED TILDE
0x2243, // ASYMPTOTICALLY EQUAL TO
0x2252, // APPROXIMATELY EQUAL TO OR THE IMAGE OF
0x2253, // IMAGE OF OR APPROXIMATELY EQUAL TO
0x2254, // COLON EQUALS
0x2255, // EQUALS COLON
0x2264, // LESS-THAN OR EQUAL TO
0x2265, // GREATER-THAN OR EQUAL TO
0x2266, // LESS-THAN OVER EQUAL TO
0x2267, // GREATER-THAN OVER EQUAL TO
0x2268, // LESS-THAN BUT NOT EQUAL TO
0x2269, // GREATER-THAN BUT NOT EQUAL TO
0x226A, // MUCH LESS-THAN
0x226B, // MUCH GREATER-THAN
0x226E, // NOT LESS-THAN
0x226F, // NOT GREATER-THAN
0x2270, // NEITHER LESS-THAN NOR EQUAL TO
0x2271, // NEITHER GREATER-THAN NOR EQUAL TO
0x2272, // LESS-THAN OR EQUIVALENT TO
0x2273, // GREATER-THAN OR EQUIVALENT TO
0x2274, // NEITHER LESS-THAN NOR EQUIVALENT TO
0x2275, // NEITHER GREATER-THAN NOR EQUIVALENT TO
0x2276, // LESS-THAN OR GREATER-THAN
0x2277, // GREATER-THAN OR LESS-THAN
0x2278, // NEITHER LESS-THAN NOR GREATER-THAN
0x2279, // NEITHER GREATER-THAN NOR LESS-THAN
0x227A, // PRECEDES
0x227B, // SUCCEEDS
0x227C, // PRECEDES OR EQUAL TO
0x227D, // SUCCEEDS OR EQUAL TO
0x227E, // PRECEDES OR EQUIVALENT TO
0x227F, // SUCCEEDS OR EQUIVALENT TO
0x2280, // DOES NOT PRECEDE
0x2281, // DOES NOT SUCCEED
0x2282, // SUBSET OF
0x2283, // SUPERSET OF
0x2284, // NOT A SUBSET OF
0x2285, // NOT A SUPERSET OF
0x2286, // SUBSET OF OR EQUAL TO
0x2287, // SUPERSET OF OR EQUAL TO
0x2288, // NEITHER A SUBSET OF NOR EQUAL TO
0x2289, // NEITHER A SUPERSET OF NOR EQUAL TO
0x228A, // SUBSET OF WITH NOT EQUAL TO
0x228B, // SUPERSET OF WITH NOT EQUAL TO
0x228F, // SQUARE IMAGE OF
0x2290, // SQUARE ORIGINAL OF
0x2291, // SQUARE IMAGE OF OR EQUAL TO
0x2292, // SQUARE ORIGINAL OF OR EQUAL TO
0x2298, // CIRCLED DIVISION SLASH
0x22A2, // RIGHT TACK
0x22A3, // LEFT TACK
0x22A6, // ASSERTION
0x22A8, // TRUE
0x22A9, // FORCES
0x22AB, // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
0x22B0, // PRECEDES UNDER RELATION
0x22B1, // SUCCEEDS UNDER RELATION
0x22B2, // NORMAL SUBGROUP OF
0x22B3, // CONTAINS AS NORMAL SUBGROUP
0x22B4, // NORMAL SUBGROUP OF OR EQUAL TO
0x22B5, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
0x22B6, // ORIGINAL OF
0x22B7, // IMAGE OF
0x22C9, // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
0x22CA, // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
0x22CB, // LEFT SEMIDIRECT PRODUCT
0x22CC, // RIGHT SEMIDIRECT PRODUCT
0x22CD, // REVERSED TILDE EQUALS
0x22D0, // DOUBLE SUBSET
0x22D1, // DOUBLE SUPERSET
0x22D6, // LESS-THAN WITH DOT
0x22D7, // GREATER-THAN WITH DOT
0x22D8, // VERY MUCH LESS-THAN
0x22D9, // VERY MUCH GREATER-THAN
0x22DA, // LESS-THAN EQUAL TO OR GREATER-THAN
0x22DB, // GREATER-THAN EQUAL TO OR LESS-THAN
0x22DC, // EQUAL TO OR LESS-THAN
0x22DD, // EQUAL TO OR GREATER-THAN
0x22DE, // EQUAL TO OR PRECEDES
0x22DF, // EQUAL TO OR SUCCEEDS
0x22E0, // DOES NOT PRECEDE OR EQUAL
0x22E1, // DOES NOT SUCCEED OR EQUAL
0x22E2, // NOT SQUARE IMAGE OF OR EQUAL TO
0x22E3, // NOT SQUARE ORIGINAL OF OR EQUAL TO
0x22E4, // SQUARE IMAGE OF OR NOT EQUAL TO
0x22E5, // SQUARE ORIGINAL OF OR NOT EQUAL TO
0x22E6, // LESS-THAN BUT NOT EQUIVALENT TO
0x22E7, // GREATER-THAN BUT NOT EQUIVALENT TO
0x22E8, // PRECEDES BUT NOT EQUIVALENT TO
0x22E9, // SUCCEEDS BUT NOT EQUIVALENT TO
0x22EA, // NOT NORMAL SUBGROUP OF
0x22EB, // DOES NOT CONTAIN AS NORMAL SUBGROUP
0x22EC, // NOT NORMAL SUBGROUP OF OR EQUAL TO
0x22ED, // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
0x22F0, // UP RIGHT DIAGONAL ELLIPSIS
0x22F1, // DOWN RIGHT DIAGONAL ELLIPSIS
0x22F2, // ELEMENT OF WITH LONG HORIZONTAL STROKE
0x22F3, // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
0x22F4, // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
0x22F6, // ELEMENT OF WITH OVERBAR
0x22F7, // SMALL ELEMENT OF WITH OVERBAR
0x22FA, // CONTAINS WITH LONG HORIZONTAL STROKE
0x22FB, // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
0x22FC, // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
0x22FD, // CONTAINS WITH OVERBAR
0x22FE, // SMALL CONTAINS WITH OVERBAR
0x2308, // LEFT CEILING
0x2309, // RIGHT CEILING
0x230A, // LEFT FLOOR
0x230B, // RIGHT FLOOR
0x2329, // LEFT-POINTING ANGLE BRACKET
0x232A, // RIGHT-POINTING ANGLE BRACKET
0x2768, // MEDIUM LEFT PARENTHESIS ORNAMENT
0x2769, // MEDIUM RIGHT PARENTHESIS ORNAMENT
0x276A, // MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
0x276B, // MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
0x276C, // MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
0x276D, // MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
0x276E, // HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
0x276F, // HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
0x2770, // HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
0x2771, // HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
0x2772, // LIGHT LEFT TORTOISE SHELL BRACKET
0x2773, // LIGHT RIGHT TORTOISE SHELL BRACKET
0x2774, // MEDIUM LEFT CURLY BRACKET ORNAMENT
0x2775, // MEDIUM RIGHT CURLY BRACKET ORNAMENT
0x27C3, // OPEN SUBSET
0x27C4, // OPEN SUPERSET
0x27C5, // LEFT S-SHAPED BAG DELIMITER
0x27C6, // RIGHT S-SHAPED BAG DELIMITER
0x27C8, // REVERSE SOLIDUS PRECEDING SUBSET
0x27C9, // SUPERSET PRECEDING SOLIDUS
0x27D5, // LEFT OUTER JOIN
0x27D6, // RIGHT OUTER JOIN
0x27DD, // LONG RIGHT TACK
0x27DE, // LONG LEFT TACK
0x27E2, // WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
0x27E3, // WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
0x27E4, // WHITE SQUARE WITH LEFTWARDS TICK
0x27E5, // WHITE SQUARE WITH RIGHTWARDS TICK
0x27E6, // MATHEMATICAL LEFT WHITE SQUARE BRACKET
0x27E7, // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
0x27E8, // MATHEMATICAL LEFT ANGLE BRACKET
0x27E9, // MATHEMATICAL RIGHT ANGLE BRACKET
0x27EA, // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
0x27EB, // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
0x27EC, // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
0x27ED, // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
0x27EE, // MATHEMATICAL LEFT FLATTENED PARENTHESIS
0x27EF, // MATHEMATICAL RIGHT FLATTENED PARENTHESIS
0x2983, // LEFT WHITE CURLY BRACKET
0x2984, // RIGHT WHITE CURLY BRACKET
0x2985, // LEFT WHITE PARENTHESIS
0x2986, // RIGHT WHITE PARENTHESIS
0x2987, // Z NOTATION LEFT IMAGE BRACKET
0x2988, // Z NOTATION RIGHT IMAGE BRACKET
0x2989, // Z NOTATION LEFT BINDING BRACKET
0x298A, // Z NOTATION RIGHT BINDING BRACKET
0x298B, // LEFT SQUARE BRACKET WITH UNDERBAR
0x298C, // RIGHT SQUARE BRACKET WITH UNDERBAR
0x298D, // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
0x298E, // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
0x298F, // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
0x2990, // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
0x2991, // LEFT ANGLE BRACKET WITH DOT
0x2992, // RIGHT ANGLE BRACKET WITH DOT
0x2993, // LEFT ARC LESS-THAN BRACKET
0x2994, // RIGHT ARC GREATER-THAN BRACKET
0x2995, // DOUBLE LEFT ARC GREATER-THAN BRACKET
0x2996, // DOUBLE RIGHT ARC LESS-THAN BRACKET
0x2997, // LEFT BLACK TORTOISE SHELL BRACKET
0x2998, // RIGHT BLACK TORTOISE SHELL BRACKET
0x29B8, // CIRCLED REVERSE SOLIDUS
0x29C0, // CIRCLED LESS-THAN
0x29C1, // CIRCLED GREATER-THAN
0x29C4, // SQUARED RISING DIAGONAL SLASH
0x29C5, // SQUARED FALLING DIAGONAL SLASH
0x29CF, // LEFT TRIANGLE BESIDE VERTICAL BAR
0x29D0, // VERTICAL BAR BESIDE RIGHT TRIANGLE
0x29D1, // BOWTIE WITH LEFT HALF BLACK
0x29D2, // BOWTIE WITH RIGHT HALF BLACK
0x29D4, // TIMES WITH LEFT HALF BLACK
0x29D5, // TIMES WITH RIGHT HALF BLACK
0x29D8, // LEFT WIGGLY FENCE
0x29D9, // RIGHT WIGGLY FENCE
0x29DA, // LEFT DOUBLE WIGGLY FENCE
0x29DB, // RIGHT DOUBLE WIGGLY FENCE
0x29F5, // REVERSE SOLIDUS OPERATOR
0x29F8, // BIG SOLIDUS
0x29F9, // BIG REVERSE SOLIDUS
0x29FC, // LEFT-POINTING CURVED ANGLE BRACKET
0x29FD, // RIGHT-POINTING CURVED ANGLE BRACKET
0x2A2B, // MINUS SIGN WITH FALLING DOTS
0x2A2C, // MINUS SIGN WITH RISING DOTS
0x2A2D, // PLUS SIGN IN LEFT HALF CIRCLE
0x2A2E, // PLUS SIGN IN RIGHT HALF CIRCLE
0x2A34, // MULTIPLICATION SIGN IN LEFT HALF CIRCLE
0x2A35, // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
0x2A3C, // INTERIOR PRODUCT
0x2A3D, // RIGHTHAND INTERIOR PRODUCT
0x2A64, // Z NOTATION DOMAIN ANTIRESTRICTION
0x2A65, // Z NOTATION RANGE ANTIRESTRICTION
0x2A79, // LESS-THAN WITH CIRCLE INSIDE
0x2A7A, // GREATER-THAN WITH CIRCLE INSIDE
0x2A7D, // LESS-THAN OR SLANTED EQUAL TO
0x2A7E, // GREATER-THAN OR SLANTED EQUAL TO
0x2A7F, // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
0x2A80, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
0x2A81, // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
0x2A82, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
0x2A83, // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
0x2A84, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
0x2A8B, // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
0x2A8C, // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
0x2A91, // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
0x2A92, // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
0x2A93, // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
0x2A94, // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
0x2A95, // SLANTED EQUAL TO OR LESS-THAN
0x2A96, // SLANTED EQUAL TO OR GREATER-THAN
0x2A97, // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
0x2A98, // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
0x2A99, // DOUBLE-LINE EQUAL TO OR LESS-THAN
0x2A9A, // DOUBLE-LINE EQUAL TO OR GREATER-THAN
0x2A9B, // DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
0x2A9C, // DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
0x2AA1, // DOUBLE NESTED LESS-THAN
0x2AA2, // DOUBLE NESTED GREATER-THAN
0x2AA6, // LESS-THAN CLOSED BY CURVE
0x2AA7, // GREATER-THAN CLOSED BY CURVE
0x2AA8, // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
0x2AA9, // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
0x2AAA, // SMALLER THAN
0x2AAB, // LARGER THAN
0x2AAC, // SMALLER THAN OR EQUAL TO
0x2AAD, // LARGER THAN OR EQUAL TO
0x2AAF, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
0x2AB0, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
0x2AB3, // PRECEDES ABOVE EQUALS SIGN
0x2AB4, // SUCCEEDS ABOVE EQUALS SIGN
0x2ABB, // DOUBLE PRECEDES
0x2ABC, // DOUBLE SUCCEEDS
0x2ABD, // SUBSET WITH DOT
0x2ABE, // SUPERSET WITH DOT
0x2ABF, // SUBSET WITH PLUS SIGN BELOW
0x2AC0, // SUPERSET WITH PLUS SIGN BELOW
0x2AC1, // SUBSET WITH MULTIPLICATION SIGN BELOW
0x2AC2, // SUPERSET WITH MULTIPLICATION SIGN BELOW
0x2AC3, // SUBSET OF OR EQUAL TO WITH DOT ABOVE
0x2AC4, // SUPERSET OF OR EQUAL TO WITH DOT ABOVE
0x2AC5, // SUBSET OF ABOVE EQUALS SIGN
0x2AC6, // SUPERSET OF ABOVE EQUALS SIGN
0x2ACD, // SQUARE LEFT OPEN BOX OPERATOR
0x2ACE, // SQUARE RIGHT OPEN BOX OPERATOR
0x2ACF, // CLOSED SUBSET
0x2AD0, // CLOSED SUPERSET
0x2AD1, // CLOSED SUBSET OR EQUAL TO
0x2AD2, // CLOSED SUPERSET OR EQUAL TO
0x2AD3, // SUBSET ABOVE SUPERSET
0x2AD4, // SUPERSET ABOVE SUBSET
0x2AD5, // SUBSET ABOVE SUBSET
0x2AD6, // SUPERSET ABOVE SUPERSET
0x2ADE, // SHORT LEFT TACK
0x2AE3, // DOUBLE VERTICAL BAR LEFT TURNSTILE
0x2AE4, // VERTICAL BAR DOUBLE LEFT TURNSTILE
0x2AE5, // DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
0x2AEC, // DOUBLE STROKE NOT SIGN
0x2AED, // REVERSED DOUBLE STROKE NOT SIGN
0x2AF7, // TRIPLE NESTED LESS-THAN
0x2AF8, // TRIPLE NESTED GREATER-THAN
0x2AF9, // DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
0x2AFA, // DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
0x2E02, // LEFT SUBSTITUTION BRACKET
0x2E03, // RIGHT SUBSTITUTION BRACKET
0x2E04, // LEFT DOTTED SUBSTITUTION BRACKET
0x2E05, // RIGHT DOTTED SUBSTITUTION BRACKET
0x2E09, // LEFT TRANSPOSITION BRACKET
0x2E0A, // RIGHT TRANSPOSITION BRACKET
0x2E0C, // LEFT RAISED OMISSION BRACKET
0x2E0D, // RIGHT RAISED OMISSION BRACKET
0x2E1C, // LEFT LOW PARAPHRASE BRACKET
0x2E1D, // RIGHT LOW PARAPHRASE BRACKET
0x2E20, // LEFT VERTICAL BAR WITH QUILL
0x2E21, // RIGHT VERTICAL BAR WITH QUILL
0x2E22, // TOP LEFT HALF BRACKET
0x2E23, // TOP RIGHT HALF BRACKET
0x2E24, // BOTTOM LEFT HALF BRACKET
0x2E25, // BOTTOM RIGHT HALF BRACKET
0x2E26, // LEFT SIDEWAYS U BRACKET
0x2E27, // RIGHT SIDEWAYS U BRACKET
0x2E28, // LEFT DOUBLE PARENTHESIS
0x2E29, // RIGHT DOUBLE PARENTHESIS
0x3008, // LEFT ANGLE BRACKET
0x3009, // RIGHT ANGLE BRACKET
0x300A, // LEFT DOUBLE ANGLE BRACKET
0x300B, // RIGHT DOUBLE ANGLE BRACKET
0x300C, // LEFT CORNER BRACKET
0x300D, // RIGHT CORNER BRACKET
0x300E, // LEFT WHITE CORNER BRACKET
0x300F, // RIGHT WHITE CORNER BRACKET
0x3010, // LEFT BLACK LENTICULAR BRACKET
0x3011, // RIGHT BLACK LENTICULAR BRACKET
0x3014, // LEFT TORTOISE SHELL BRACKET
0x3015, // RIGHT TORTOISE SHELL BRACKET
0x3016, // LEFT WHITE LENTICULAR BRACKET
0x3017, // RIGHT WHITE LENTICULAR BRACKET
0x3018, // LEFT WHITE TORTOISE SHELL BRACKET
0x3019, // RIGHT WHITE TORTOISE SHELL BRACKET
0x301A, // LEFT WHITE SQUARE BRACKET
0x301B, // RIGHT WHITE SQUARE BRACKET
0xFE59, // SMALL LEFT PARENTHESIS
0xFE5A, // SMALL RIGHT PARENTHESIS
0xFE5B, // SMALL LEFT CURLY BRACKET
0xFE5C, // SMALL RIGHT CURLY BRACKET
0xFE5D, // SMALL LEFT TORTOISE SHELL BRACKET
0xFE5E, // SMALL RIGHT TORTOISE SHELL BRACKET
0xFE64, // SMALL LESS-THAN SIGN
0xFE65, // SMALL GREATER-THAN SIGN
0xFF08, // FULLWIDTH LEFT PARENTHESIS
0xFF09, // FULLWIDTH RIGHT PARENTHESIS
0xFF1C, // FULLWIDTH LESS-THAN SIGN
0xFF1E, // FULLWIDTH GREATER-THAN SIGN
0xFF3B, // FULLWIDTH LEFT SQUARE BRACKET
0xFF3D, // FULLWIDTH RIGHT SQUARE BRACKET
0xFF5B, // FULLWIDTH LEFT CURLY BRACKET
0xFF5D, // FULLWIDTH RIGHT CURLY BRACKET
0xFF5F, // FULLWIDTH LEFT WHITE PARENTHESIS
0xFF60, // FULLWIDTH RIGHT WHITE PARENTHESIS
0xFF62, // HALFWIDTH LEFT CORNER BRACKET
0xFF63, // HALFWIDTH RIGHT CORNER BRACKET
};
private static final int[] mirVal = new int[] {
0x0029, // MIRROR(LEFT PARENTHESIS)
0x0028, // MIRROR(RIGHT PARENTHESIS)
0x003E, // MIRROR(LESS-THAN SIGN)
0x003C, // MIRROR(GREATER-THAN SIGN)
0x005D, // MIRROR(LEFT SQUARE BRACKET)
0x005B, // MIRROR(RIGHT SQUARE BRACKET)
0x007D, // MIRROR(LEFT CURLY BRACKET)
0x007B, // MIRROR(RIGHT CURLY BRACKET)
0x00BB, // MIRROR(LEFT-POINTING DOUBLE ANGLE QUOTATION MARK)
0x00AB, // MIRROR(RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK)
0x0F3B, // MIRROR(TIBETAN MARK GUG RTAGS GYON)
0x0F3A, // MIRROR(TIBETAN MARK GUG RTAGS GYAS)
0x0F3D, // MIRROR(TIBETAN MARK ANG KHANG GYON)
0x0F3C, // MIRROR(TIBETAN MARK ANG KHANG GYAS)
0x169C, // MIRROR(OGHAM FEATHER MARK)
0x169B, // MIRROR(OGHAM REVERSED FEATHER MARK)
0x203A, // MIRROR(SINGLE LEFT-POINTING ANGLE QUOTATION MARK)
0x2039, // MIRROR(SINGLE RIGHT-POINTING ANGLE QUOTATION MARK)
0x2046, // MIRROR(LEFT SQUARE BRACKET WITH QUILL)
0x2045, // MIRROR(RIGHT SQUARE BRACKET WITH QUILL)
0x207E, // MIRROR(SUPERSCRIPT LEFT PARENTHESIS)
0x207D, // MIRROR(SUPERSCRIPT RIGHT PARENTHESIS)
0x208E, // MIRROR(SUBSCRIPT LEFT PARENTHESIS)
0x208D, // MIRROR(SUBSCRIPT RIGHT PARENTHESIS)
0x220B, // MIRROR(ELEMENT OF)
0x220C, // MIRROR(NOT AN ELEMENT OF)
0x220D, // MIRROR(SMALL ELEMENT OF)
0x2208, // MIRROR(CONTAINS AS MEMBER)
0x2209, // MIRROR(DOES NOT CONTAIN AS MEMBER)
0x220A, // MIRROR(SMALL CONTAINS AS MEMBER)
0x29F5, // MIRROR(DIVISION SLASH)
0x223D, // MIRROR(TILDE OPERATOR)
0x223C, // MIRROR(REVERSED TILDE)
0x22CD, // MIRROR(ASYMPTOTICALLY EQUAL TO)
0x2253, // MIRROR(APPROXIMATELY EQUAL TO OR THE IMAGE OF)
0x2252, // MIRROR(IMAGE OF OR APPROXIMATELY EQUAL TO)
0x2255, // MIRROR(COLON EQUALS)
0x2254, // MIRROR(EQUALS COLON)
0x2265, // MIRROR(LESS-THAN OR EQUAL TO)
0x2264, // MIRROR(GREATER-THAN OR EQUAL TO)
0x2267, // MIRROR(LESS-THAN OVER EQUAL TO)
0x2266, // MIRROR(GREATER-THAN OVER EQUAL TO)
0x2269, // MIRROR(LESS-THAN BUT NOT EQUAL TO)
0x2268, // MIRROR(GREATER-THAN BUT NOT EQUAL TO)
0x226B, // MIRROR(MUCH LESS-THAN)
0x226A, // MIRROR(MUCH GREATER-THAN)
0x226F, // MIRROR(NOT LESS-THAN)
0x226E, // MIRROR(NOT GREATER-THAN)
0x2271, // MIRROR(NEITHER LESS-THAN NOR EQUAL TO)
0x2270, // MIRROR(NEITHER GREATER-THAN NOR EQUAL TO)
0x2273, // MIRROR(LESS-THAN OR EQUIVALENT TO)
0x2272, // MIRROR(GREATER-THAN OR EQUIVALENT TO)
0x2275, // MIRROR(NEITHER LESS-THAN NOR EQUIVALENT TO)
0x2274, // MIRROR(NEITHER GREATER-THAN NOR EQUIVALENT TO)
0x2277, // MIRROR(LESS-THAN OR GREATER-THAN)
0x2276, // MIRROR(GREATER-THAN OR LESS-THAN)
0x2279, // MIRROR(NEITHER LESS-THAN NOR GREATER-THAN)
0x2278, // MIRROR(NEITHER GREATER-THAN NOR LESS-THAN)
0x227B, // MIRROR(PRECEDES)
0x227A, // MIRROR(SUCCEEDS)
0x227D, // MIRROR(PRECEDES OR EQUAL TO)
0x227C, // MIRROR(SUCCEEDS OR EQUAL TO)
0x227F, // MIRROR(PRECEDES OR EQUIVALENT TO)
0x227E, // MIRROR(SUCCEEDS OR EQUIVALENT TO)
0x2281, // MIRROR(DOES NOT PRECEDE)
0x2280, // MIRROR(DOES NOT SUCCEED)
0x2283, // MIRROR(SUBSET OF)
0x2282, // MIRROR(SUPERSET OF)
0x2285, // MIRROR(NOT A SUBSET OF)
0x2284, // MIRROR(NOT A SUPERSET OF)
0x2287, // MIRROR(SUBSET OF OR EQUAL TO)
0x2286, // MIRROR(SUPERSET OF OR EQUAL TO)
0x2289, // MIRROR(NEITHER A SUBSET OF NOR EQUAL TO)
0x2288, // MIRROR(NEITHER A SUPERSET OF NOR EQUAL TO)
0x228B, // MIRROR(SUBSET OF WITH NOT EQUAL TO)
0x228A, // MIRROR(SUPERSET OF WITH NOT EQUAL TO)
0x2290, // MIRROR(SQUARE IMAGE OF)
0x228F, // MIRROR(SQUARE ORIGINAL OF)
0x2292, // MIRROR(SQUARE IMAGE OF OR EQUAL TO)
0x2291, // MIRROR(SQUARE ORIGINAL OF OR EQUAL TO)
0x29B8, // MIRROR(CIRCLED DIVISION SLASH)
0x22A3, // MIRROR(RIGHT TACK)
0x22A2, // MIRROR(LEFT TACK)
0x2ADE, // MIRROR(ASSERTION)
0x2AE4, // MIRROR(TRUE)
0x2AE3, // MIRROR(FORCES)
0x2AE5, // MIRROR(DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE)
0x22B1, // MIRROR(PRECEDES UNDER RELATION)
0x22B0, // MIRROR(SUCCEEDS UNDER RELATION)
0x22B3, // MIRROR(NORMAL SUBGROUP OF)
0x22B2, // MIRROR(CONTAINS AS NORMAL SUBGROUP)
0x22B5, // MIRROR(NORMAL SUBGROUP OF OR EQUAL TO)
0x22B4, // MIRROR(CONTAINS AS NORMAL SUBGROUP OR EQUAL TO)
0x22B7, // MIRROR(ORIGINAL OF)
0x22B6, // MIRROR(IMAGE OF)
0x22CA, // MIRROR(LEFT NORMAL FACTOR SEMIDIRECT PRODUCT)
0x22C9, // MIRROR(RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT)
0x22CC, // MIRROR(LEFT SEMIDIRECT PRODUCT)
0x22CB, // MIRROR(RIGHT SEMIDIRECT PRODUCT)
0x2243, // MIRROR(REVERSED TILDE EQUALS)
0x22D1, // MIRROR(DOUBLE SUBSET)
0x22D0, // MIRROR(DOUBLE SUPERSET)
0x22D7, // MIRROR(LESS-THAN WITH DOT)
0x22D6, // MIRROR(GREATER-THAN WITH DOT)
0x22D9, // MIRROR(VERY MUCH LESS-THAN)
0x22D8, // MIRROR(VERY MUCH GREATER-THAN)
0x22DB, // MIRROR(LESS-THAN EQUAL TO OR GREATER-THAN)
0x22DA, // MIRROR(GREATER-THAN EQUAL TO OR LESS-THAN)
0x22DD, // MIRROR(EQUAL TO OR LESS-THAN)
0x22DC, // MIRROR(EQUAL TO OR GREATER-THAN)
0x22DF, // MIRROR(EQUAL TO OR PRECEDES)
0x22DE, // MIRROR(EQUAL TO OR SUCCEEDS)
0x22E1, // MIRROR(DOES NOT PRECEDE OR EQUAL)
0x22E0, // MIRROR(DOES NOT SUCCEED OR EQUAL)
0x22E3, // MIRROR(NOT SQUARE IMAGE OF OR EQUAL TO)
0x22E2, // MIRROR(NOT SQUARE ORIGINAL OF OR EQUAL TO)
0x22E5, // MIRROR(SQUARE IMAGE OF OR NOT EQUAL TO)
0x22E4, // MIRROR(SQUARE ORIGINAL OF OR NOT EQUAL TO)
0x22E7, // MIRROR(LESS-THAN BUT NOT EQUIVALENT TO)
0x22E6, // MIRROR(GREATER-THAN BUT NOT EQUIVALENT TO)
0x22E9, // MIRROR(PRECEDES BUT NOT EQUIVALENT TO)
0x22E8, // MIRROR(SUCCEEDS BUT NOT EQUIVALENT TO)
0x22EB, // MIRROR(NOT NORMAL SUBGROUP OF)
0x22EA, // MIRROR(DOES NOT CONTAIN AS NORMAL SUBGROUP)
0x22ED, // MIRROR(NOT NORMAL SUBGROUP OF OR EQUAL TO)
0x22EC, // MIRROR(DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL)
0x22F1, // MIRROR(UP RIGHT DIAGONAL ELLIPSIS)
0x22F0, // MIRROR(DOWN RIGHT DIAGONAL ELLIPSIS)
0x22FA, // MIRROR(ELEMENT OF WITH LONG HORIZONTAL STROKE)
0x22FB, // MIRROR(ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE)
0x22FC, // MIRROR(SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE)
0x22FD, // MIRROR(ELEMENT OF WITH OVERBAR)
0x22FE, // MIRROR(SMALL ELEMENT OF WITH OVERBAR)
0x22F2, // MIRROR(CONTAINS WITH LONG HORIZONTAL STROKE)
0x22F3, // MIRROR(CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE)
0x22F4, // MIRROR(SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE)
0x22F6, // MIRROR(CONTAINS WITH OVERBAR)
0x22F7, // MIRROR(SMALL CONTAINS WITH OVERBAR)
0x2309, // MIRROR(LEFT CEILING)
0x2308, // MIRROR(RIGHT CEILING)
0x230B, // MIRROR(LEFT FLOOR)
0x230A, // MIRROR(RIGHT FLOOR)
0x232A, // MIRROR(LEFT-POINTING ANGLE BRACKET)
0x2329, // MIRROR(RIGHT-POINTING ANGLE BRACKET)
0x2769, // MIRROR(MEDIUM LEFT PARENTHESIS ORNAMENT)
0x2768, // MIRROR(MEDIUM RIGHT PARENTHESIS ORNAMENT)
0x276B, // MIRROR(MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT)
0x276A, // MIRROR(MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT)
0x276D, // MIRROR(MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT)
0x276C, // MIRROR(MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT)
0x276F, // MIRROR(HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT)
0x276E, // MIRROR(HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT)
0x2771, // MIRROR(HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT)
0x2770, // MIRROR(HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT)
0x2773, // MIRROR(LIGHT LEFT TORTOISE SHELL BRACKET)
0x2772, // MIRROR(LIGHT RIGHT TORTOISE SHELL BRACKET)
0x2775, // MIRROR(MEDIUM LEFT CURLY BRACKET ORNAMENT)
0x2774, // MIRROR(MEDIUM RIGHT CURLY BRACKET ORNAMENT)
0x27C4, // MIRROR(OPEN SUBSET)
0x27C3, // MIRROR(OPEN SUPERSET)
0x27C6, // MIRROR(LEFT S-SHAPED BAG DELIMITER)
0x27C5, // MIRROR(RIGHT S-SHAPED BAG DELIMITER)
0x27C9, // MIRROR(REVERSE SOLIDUS PRECEDING SUBSET)
0x27C8, // MIRROR(SUPERSET PRECEDING SOLIDUS)
0x27D6, // MIRROR(LEFT OUTER JOIN)
0x27D5, // MIRROR(RIGHT OUTER JOIN)
0x27DE, // MIRROR(LONG RIGHT TACK)
0x27DD, // MIRROR(LONG LEFT TACK)
0x27E3, // MIRROR(WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK)
0x27E2, // MIRROR(WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK)
0x27E5, // MIRROR(WHITE SQUARE WITH LEFTWARDS TICK)
0x27E4, // MIRROR(WHITE SQUARE WITH RIGHTWARDS TICK)
0x27E7, // MIRROR(MATHEMATICAL LEFT WHITE SQUARE BRACKET)
0x27E6, // MIRROR(MATHEMATICAL RIGHT WHITE SQUARE BRACKET)
0x27E9, // MIRROR(MATHEMATICAL LEFT ANGLE BRACKET)
0x27E8, // MIRROR(MATHEMATICAL RIGHT ANGLE BRACKET)
0x27EB, // MIRROR(MATHEMATICAL LEFT DOUBLE ANGLE BRACKET)
0x27EA, // MIRROR(MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET)
0x27ED, // MIRROR(MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET)
0x27EC, // MIRROR(MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET)
0x27EF, // MIRROR(MATHEMATICAL LEFT FLATTENED PARENTHESIS)
0x27EE, // MIRROR(MATHEMATICAL RIGHT FLATTENED PARENTHESIS)
0x2984, // MIRROR(LEFT WHITE CURLY BRACKET)
0x2983, // MIRROR(RIGHT WHITE CURLY BRACKET)
0x2986, // MIRROR(LEFT WHITE PARENTHESIS)
0x2985, // MIRROR(RIGHT WHITE PARENTHESIS)
0x2988, // MIRROR(Z NOTATION LEFT IMAGE BRACKET)
0x2987, // MIRROR(Z NOTATION RIGHT IMAGE BRACKET)
0x298A, // MIRROR(Z NOTATION LEFT BINDING BRACKET)
0x2989, // MIRROR(Z NOTATION RIGHT BINDING BRACKET)
0x298C, // MIRROR(LEFT SQUARE BRACKET WITH UNDERBAR)
0x298B, // MIRROR(RIGHT SQUARE BRACKET WITH UNDERBAR)
0x2990, // MIRROR(LEFT SQUARE BRACKET WITH TICK IN TOP CORNER)
0x298F, // MIRROR(RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER)
0x298E, // MIRROR(LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER)
0x298D, // MIRROR(RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER)
0x2992, // MIRROR(LEFT ANGLE BRACKET WITH DOT)
0x2991, // MIRROR(RIGHT ANGLE BRACKET WITH DOT)
0x2994, // MIRROR(LEFT ARC LESS-THAN BRACKET)
0x2993, // MIRROR(RIGHT ARC GREATER-THAN BRACKET)
0x2996, // MIRROR(DOUBLE LEFT ARC GREATER-THAN BRACKET)
0x2995, // MIRROR(DOUBLE RIGHT ARC LESS-THAN BRACKET)
0x2998, // MIRROR(LEFT BLACK TORTOISE SHELL BRACKET)
0x2997, // MIRROR(RIGHT BLACK TORTOISE SHELL BRACKET)
0x2298, // MIRROR(CIRCLED REVERSE SOLIDUS)
0x29C1, // MIRROR(CIRCLED LESS-THAN)
0x29C0, // MIRROR(CIRCLED GREATER-THAN)
0x29C5, // MIRROR(SQUARED RISING DIAGONAL SLASH)
0x29C4, // MIRROR(SQUARED FALLING DIAGONAL SLASH)
0x29D0, // MIRROR(LEFT TRIANGLE BESIDE VERTICAL BAR)
0x29CF, // MIRROR(VERTICAL BAR BESIDE RIGHT TRIANGLE)
0x29D2, // MIRROR(BOWTIE WITH LEFT HALF BLACK)
0x29D1, // MIRROR(BOWTIE WITH RIGHT HALF BLACK)
0x29D5, // MIRROR(TIMES WITH LEFT HALF BLACK)
0x29D4, // MIRROR(TIMES WITH RIGHT HALF BLACK)
0x29D9, // MIRROR(LEFT WIGGLY FENCE)
0x29D8, // MIRROR(RIGHT WIGGLY FENCE)
0x29DB, // MIRROR(LEFT DOUBLE WIGGLY FENCE)
0x29DA, // MIRROR(RIGHT DOUBLE WIGGLY FENCE)
0x2215, // MIRROR(REVERSE SOLIDUS OPERATOR)
0x29F9, // MIRROR(BIG SOLIDUS)
0x29F8, // MIRROR(BIG REVERSE SOLIDUS)
0x29FD, // MIRROR(LEFT-POINTING CURVED ANGLE BRACKET)
0x29FC, // MIRROR(RIGHT-POINTING CURVED ANGLE BRACKET)
0x2A2C, // MIRROR(MINUS SIGN WITH FALLING DOTS)
0x2A2B, // MIRROR(MINUS SIGN WITH RISING DOTS)
0x2A2E, // MIRROR(PLUS SIGN IN LEFT HALF CIRCLE)
0x2A2D, // MIRROR(PLUS SIGN IN RIGHT HALF CIRCLE)
0x2A35, // MIRROR(MULTIPLICATION SIGN IN LEFT HALF CIRCLE)
0x2A34, // MIRROR(MULTIPLICATION SIGN IN RIGHT HALF CIRCLE)
0x2A3D, // MIRROR(INTERIOR PRODUCT)
0x2A3C, // MIRROR(RIGHTHAND INTERIOR PRODUCT)
0x2A65, // MIRROR(Z NOTATION DOMAIN ANTIRESTRICTION)
0x2A64, // MIRROR(Z NOTATION RANGE ANTIRESTRICTION)
0x2A7A, // MIRROR(LESS-THAN WITH CIRCLE INSIDE)
0x2A79, // MIRROR(GREATER-THAN WITH CIRCLE INSIDE)
0x2A7E, // MIRROR(LESS-THAN OR SLANTED EQUAL TO)
0x2A7D, // MIRROR(GREATER-THAN OR SLANTED EQUAL TO)
0x2A80, // MIRROR(LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE)
0x2A7F, // MIRROR(GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE)
0x2A82, // MIRROR(LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE)
0x2A81, // MIRROR(GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE)
0x2A84, // MIRROR(LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT)
0x2A83, // MIRROR(GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT)
0x2A8C, // MIRROR(LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN)
0x2A8B, // MIRROR(GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN)
0x2A92, // MIRROR(LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL)
0x2A91, // MIRROR(GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL)
0x2A94, // MIRROR(LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL)
0x2A93, // MIRROR(GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL)
0x2A96, // MIRROR(SLANTED EQUAL TO OR LESS-THAN)
0x2A95, // MIRROR(SLANTED EQUAL TO OR GREATER-THAN)
0x2A98, // MIRROR(SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE)
0x2A97, // MIRROR(SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE)
0x2A9A, // MIRROR(DOUBLE-LINE EQUAL TO OR LESS-THAN)
0x2A99, // MIRROR(DOUBLE-LINE EQUAL TO OR GREATER-THAN)
0x2A9C, // MIRROR(DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN)
0x2A9B, // MIRROR(DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN)
0x2AA2, // MIRROR(DOUBLE NESTED LESS-THAN)
0x2AA1, // MIRROR(DOUBLE NESTED GREATER-THAN)
0x2AA7, // MIRROR(LESS-THAN CLOSED BY CURVE)
0x2AA6, // MIRROR(GREATER-THAN CLOSED BY CURVE)
0x2AA9, // MIRROR(LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL)
0x2AA8, // MIRROR(GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL)
0x2AAB, // MIRROR(SMALLER THAN)
0x2AAA, // MIRROR(LARGER THAN)
0x2AAD, // MIRROR(SMALLER THAN OR EQUAL TO)
0x2AAC, // MIRROR(LARGER THAN OR EQUAL TO)
0x2AB0, // MIRROR(PRECEDES ABOVE SINGLE-LINE EQUALS SIGN)
0x2AAF, // MIRROR(SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN)
0x2AB4, // MIRROR(PRECEDES ABOVE EQUALS SIGN)
0x2AB3, // MIRROR(SUCCEEDS ABOVE EQUALS SIGN)
0x2ABC, // MIRROR(DOUBLE PRECEDES)
0x2ABB, // MIRROR(DOUBLE SUCCEEDS)
0x2ABE, // MIRROR(SUBSET WITH DOT)
0x2ABD, // MIRROR(SUPERSET WITH DOT)
0x2AC0, // MIRROR(SUBSET WITH PLUS SIGN BELOW)
0x2ABF, // MIRROR(SUPERSET WITH PLUS SIGN BELOW)
0x2AC2, // MIRROR(SUBSET WITH MULTIPLICATION SIGN BELOW)
0x2AC1, // MIRROR(SUPERSET WITH MULTIPLICATION SIGN BELOW)
0x2AC4, // MIRROR(SUBSET OF OR EQUAL TO WITH DOT ABOVE)
0x2AC3, // MIRROR(SUPERSET OF OR EQUAL TO WITH DOT ABOVE)
0x2AC6, // MIRROR(SUBSET OF ABOVE EQUALS SIGN)
0x2AC5, // MIRROR(SUPERSET OF ABOVE EQUALS SIGN)
0x2ACE, // MIRROR(SQUARE LEFT OPEN BOX OPERATOR)
0x2ACD, // MIRROR(SQUARE RIGHT OPEN BOX OPERATOR)
0x2AD0, // MIRROR(CLOSED SUBSET)
0x2ACF, // MIRROR(CLOSED SUPERSET)
0x2AD2, // MIRROR(CLOSED SUBSET OR EQUAL TO)
0x2AD1, // MIRROR(CLOSED SUPERSET OR EQUAL TO)
0x2AD4, // MIRROR(SUBSET ABOVE SUPERSET)
0x2AD3, // MIRROR(SUPERSET ABOVE SUBSET)
0x2AD6, // MIRROR(SUBSET ABOVE SUBSET)
0x2AD5, // MIRROR(SUPERSET ABOVE SUPERSET)
0x22A6, // MIRROR(SHORT LEFT TACK)
0x22A9, // MIRROR(DOUBLE VERTICAL BAR LEFT TURNSTILE)
0x22A8, // MIRROR(VERTICAL BAR DOUBLE LEFT TURNSTILE)
0x22AB, // MIRROR(DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE)
0x2AED, // MIRROR(DOUBLE STROKE NOT SIGN)
0x2AEC, // MIRROR(REVERSED DOUBLE STROKE NOT SIGN)
0x2AF8, // MIRROR(TRIPLE NESTED LESS-THAN)
0x2AF7, // MIRROR(TRIPLE NESTED GREATER-THAN)
0x2AFA, // MIRROR(DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO)
0x2AF9, // MIRROR(DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO)
0x2E03, // MIRROR(LEFT SUBSTITUTION BRACKET)
0x2E02, // MIRROR(RIGHT SUBSTITUTION BRACKET)
0x2E05, // MIRROR(LEFT DOTTED SUBSTITUTION BRACKET)
0x2E04, // MIRROR(RIGHT DOTTED SUBSTITUTION BRACKET)
0x2E0A, // MIRROR(LEFT TRANSPOSITION BRACKET)
0x2E09, // MIRROR(RIGHT TRANSPOSITION BRACKET)
0x2E0D, // MIRROR(LEFT RAISED OMISSION BRACKET)
0x2E0C, // MIRROR(RIGHT RAISED OMISSION BRACKET)
0x2E1D, // MIRROR(LEFT LOW PARAPHRASE BRACKET)
0x2E1C, // MIRROR(RIGHT LOW PARAPHRASE BRACKET)
0x2E21, // MIRROR(LEFT VERTICAL BAR WITH QUILL)
0x2E20, // MIRROR(RIGHT VERTICAL BAR WITH QUILL)
0x2E23, // MIRROR(TOP LEFT HALF BRACKET)
0x2E22, // MIRROR(TOP RIGHT HALF BRACKET)
0x2E25, // MIRROR(BOTTOM LEFT HALF BRACKET)
0x2E24, // MIRROR(BOTTOM RIGHT HALF BRACKET)
0x2E27, // MIRROR(LEFT SIDEWAYS U BRACKET)
0x2E26, // MIRROR(RIGHT SIDEWAYS U BRACKET)
0x2E29, // MIRROR(LEFT DOUBLE PARENTHESIS)
0x2E28, // MIRROR(RIGHT DOUBLE PARENTHESIS)
0x3009, // MIRROR(LEFT ANGLE BRACKET)
0x3008, // MIRROR(RIGHT ANGLE BRACKET)
0x300B, // MIRROR(LEFT DOUBLE ANGLE BRACKET)
0x300A, // MIRROR(RIGHT DOUBLE ANGLE BRACKET)
0x300D, // MIRROR(LEFT CORNER BRACKET)
0x300C, // MIRROR(RIGHT CORNER BRACKET)
0x300F, // MIRROR(LEFT WHITE CORNER BRACKET)
0x300E, // MIRROR(RIGHT WHITE CORNER BRACKET)
0x3011, // MIRROR(LEFT BLACK LENTICULAR BRACKET)
0x3010, // MIRROR(RIGHT BLACK LENTICULAR BRACKET)
0x3015, // MIRROR(LEFT TORTOISE SHELL BRACKET)
0x3014, // MIRROR(RIGHT TORTOISE SHELL BRACKET)
0x3017, // MIRROR(LEFT WHITE LENTICULAR BRACKET)
0x3016, // MIRROR(RIGHT WHITE LENTICULAR BRACKET)
0x3019, // MIRROR(LEFT WHITE TORTOISE SHELL BRACKET)
0x3018, // MIRROR(RIGHT WHITE TORTOISE SHELL BRACKET)
0x301B, // MIRROR(LEFT WHITE SQUARE BRACKET)
0x301A, // MIRROR(RIGHT WHITE SQUARE BRACKET)
0xFE5A, // MIRROR(SMALL LEFT PARENTHESIS)
0xFE59, // MIRROR(SMALL RIGHT PARENTHESIS)
0xFE5C, // MIRROR(SMALL LEFT CURLY BRACKET)
0xFE5B, // MIRROR(SMALL RIGHT CURLY BRACKET)
0xFE5E, // MIRROR(SMALL LEFT TORTOISE SHELL BRACKET)
0xFE5D, // MIRROR(SMALL RIGHT TORTOISE SHELL BRACKET)
0xFE65, // MIRROR(SMALL LESS-THAN SIGN)
0xFE64, // MIRROR(SMALL GREATER-THAN SIGN)
0xFF09, // MIRROR(FULLWIDTH LEFT PARENTHESIS)
0xFF08, // MIRROR(FULLWIDTH RIGHT PARENTHESIS)
0xFF1E, // MIRROR(FULLWIDTH LESS-THAN SIGN)
0xFF1C, // MIRROR(FULLWIDTH GREATER-THAN SIGN)
0xFF3D, // MIRROR(FULLWIDTH LEFT SQUARE BRACKET)
0xFF3B, // MIRROR(FULLWIDTH RIGHT SQUARE BRACKET)
0xFF5D, // MIRROR(FULLWIDTH LEFT CURLY BRACKET)
0xFF5B, // MIRROR(FULLWIDTH RIGHT CURLY BRACKET)
0xFF60, // MIRROR(FULLWIDTH LEFT WHITE PARENTHESIS)
0xFF5F, // MIRROR(FULLWIDTH RIGHT WHITE PARENTHESIS)
0xFF63, // MIRROR(HALFWIDTH LEFT CORNER BRACKET)
0xFF62, // MIRROR(HALFWIDTH RIGHT CORNER BRACKET)
};
public static boolean hasMirror(int c) {
return Arrays.binarySearch(mirKey, c) >= 0;
}
public static int toMirror(int c) {
int k = Arrays.binarySearch(mirKey, c);
if (k >= 0)
return mirVal[k];
else
return c;
}
}