1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
package org.madore.android.unicodeMap;
import java.util.Arrays;
import java.util.Set;
import java.util.Map;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Formatter;
public class UnicodeCharacter {
enum Category {
UPPERCASE_LETTER("Lu", Character.UPPERCASE_LETTER),
LOWERCASE_LETTER("Ll", Character.LOWERCASE_LETTER),
TITLECASE_LETTER("Lt", Character.TITLECASE_LETTER),
MODIFIER_LETTER("Lm", Character.MODIFIER_LETTER),
OTHER_LETTER("Lo", Character.OTHER_LETTER),
NON_SPACING_MARK("Mn", Character.NON_SPACING_MARK),
COMBINING_SPACING_MARK("Mc", Character.COMBINING_SPACING_MARK),
ENCLOSING_MARK("Me", Character.ENCLOSING_MARK),
DECIMAL_DIGIT_NUMBER("Nd", Character.DECIMAL_DIGIT_NUMBER),
LETTER_NUMBER("Nl", Character.LETTER_NUMBER),
OTHER_NUMBER("No", Character.OTHER_NUMBER),
CONNECTOR_PUNCTUATION("Pc", Character.CONNECTOR_PUNCTUATION),
DASH_PUNCTUATION("Pd", Character.DASH_PUNCTUATION),
START_PUNCTUATION("Ps", Character.START_PUNCTUATION),
END_PUNCTUATION("Pe", Character.END_PUNCTUATION),
INITIAL_QUOTE_PUNCTUATION("Pi", Character.INITIAL_QUOTE_PUNCTUATION),
FINAL_QUOTE_PUNCTUATION("Pf", Character.FINAL_QUOTE_PUNCTUATION),
OTHER_PUNCTUATION("Po", Character.OTHER_PUNCTUATION),
MATH_SYMBOL("Sm", Character.MATH_SYMBOL),
CURRENCY_SYMBOL("Sc", Character.CURRENCY_SYMBOL),
MODIFIER_SYMBOL("Sk", Character.MODIFIER_SYMBOL),
OTHER_SYMBOL("So", Character.OTHER_SYMBOL),
SPACE_SEPARATOR("Zs", Character.SPACE_SEPARATOR),
LINE_SEPARATOR("Zl", Character.LINE_SEPARATOR),
PARAGRAPH_SEPARATOR("Zp", Character.PARAGRAPH_SEPARATOR),
CONTROL("Cc", Character.CONTROL),
FORMAT("Cf", Character.FORMAT),
SURROGATE("Cs", Character.SURROGATE),
PRIVATE_USE("Co", Character.PRIVATE_USE),
UNASSIGNED("Cn", Character.UNASSIGNED);
public final String code;
public final byte javaValue;
Category(String code, byte javaValue) {
this.code = code;
this.javaValue = javaValue;
}
protected final static Map<String,Category> revMap
= new HashMap<String,Category>();
static {
for ( Category cat : Category.values() )
revMap.put(cat.code, cat);
}
static Category fromCode(String code) {
Category cat = revMap.get(code);
if ( cat == null )
cat = UNASSIGNED;
return cat;
}
}
protected final static Set<Category> printable;
static {
Category[] prlist = new Category[] {
Category.UPPERCASE_LETTER, Category.LOWERCASE_LETTER,
Category.TITLECASE_LETTER, Category.MODIFIER_LETTER,
Category.OTHER_LETTER, Category.NON_SPACING_MARK,
Category.COMBINING_SPACING_MARK, Category.ENCLOSING_MARK,
Category.DECIMAL_DIGIT_NUMBER, Category.LETTER_NUMBER,
Category.OTHER_NUMBER, Category.CONNECTOR_PUNCTUATION,
Category.DASH_PUNCTUATION, Category.START_PUNCTUATION,
Category.END_PUNCTUATION, Category.INITIAL_QUOTE_PUNCTUATION,
Category.FINAL_QUOTE_PUNCTUATION, Category.OTHER_PUNCTUATION,
Category.MATH_SYMBOL, Category.CURRENCY_SYMBOL,
Category.MODIFIER_SYMBOL, Category.OTHER_SYMBOL
};
printable = EnumSet.copyOf(Arrays.asList(prlist));
}
protected final int codePoint;
protected final String name;
protected final Category category;
public UnicodeCharacter(int codePoint, String name, Category category) {
this.codePoint = codePoint;
this.name = name;
this.category = category;
}
public int getCodePoint() {
return codePoint;
}
public String getName() {
return name;
}
public boolean isPrintable() {
return printable.contains(this.category);
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
if ( this.isPrintable() ) {
s.append(Character.toChars(codePoint));
s.append(": ");
}
Formatter fmt = new Formatter(s);
if ( codePoint < 0x10000 )
fmt.format("U+%04X %s", codePoint, name);
else
fmt.format("U+%X %s", codePoint, name);
return new String(s);
}
}
|