private static final Set<Character.UnicodeBlock> UNI_BLK = new HashSet<>();
private static final Set<Character.UnicodeBlock> UNI_BLK_RARE = new HashSet<>();
private static final Set<Character.UnicodeBlock> UNI_BLK_PRIVATE = new HashSet<>();
static {
// 正常编码
UNI_BLK.add(Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS); // 4E00-9FBF CJK 统一表意符号
UNI_BLK.add(Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS); // F900-FAFF CJK 兼容象形文字
UNI_BLK.add(Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION); // 3000-303F CJK 符号和标点
UNI_BLK.add(Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A); // 3400-4DBF CJK 统一表意符号扩展A
UNI_BLK.add(Character.UnicodeBlock.GENERAL_PUNCTUATION); // 2000-206F 常用标点
UNI_BLK.add(Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS); // FF00-FFEF 半角及全角
UNI_BLK.add(Character.UnicodeBlock.BASIC_LATIN); // 拉丁字符
UNI_BLK.add(Character.UnicodeBlock.LATIN_1_SUPPLEMENT);
UNI_BLK.add(Character.UnicodeBlock.LATIN_EXTENDED_A);
UNI_BLK.add(Character.UnicodeBlock.LATIN_EXTENDED_B);
UNI_BLK.add(Character.UnicodeBlock.LATIN_EXTENDED_C);
UNI_BLK.add(Character.UnicodeBlock.LATIN_EXTENDED_D);
UNI_BLK.add(Character.UnicodeBlock.HIRAGANA); // 平假名
UNI_BLK.add(Character.UnicodeBlock.KATAKANA); // 片假名
UNI_BLK.add(Character.UnicodeBlock.MATHEMATICAL_OPERATORS); // 数学运算符
// 稀有字符,根据出现次数判断是否乱码
UNI_BLK_RARE.add(Character.UnicodeBlock.ARABIC_EXTENDED_A); // 阿拉伯语扩展A
UNI_BLK_RARE.add(Character.UnicodeBlock.ARABIC); // 阿拉伯语
UNI_BLK_RARE.add(Character.UnicodeBlock.ARMENIAN); // 亚美尼亚语
UNI_BLK_RARE.add(Character.UnicodeBlock.BALINESE); // 巴厘语
UNI_BLK_RARE.add(Character.UnicodeBlock.BENGALI); // 孟加拉语
UNI_BLK_RARE.add(Character.UnicodeBlock.BUGINESE); // 布吉尼亚语
UNI_BLK_RARE.add(Character.UnicodeBlock.BATAK); // 巴塔克 [保加利亚]
UNI_BLK_RARE.add(Character.UnicodeBlock.CHEROKEE); // 切罗基族(北美易洛魁人的一支)语
UNI_BLK_RARE.add(Character.UnicodeBlock.CYRILLIC); // 西里尔(Cyril)字母
UNI_BLK_RARE.add(Character.UnicodeBlock.DEVANAGARI); // 梵文字母
UNI_BLK_RARE.add(Character.UnicodeBlock.ETHIOPIC); // 埃塞俄比亚语
UNI_BLK_RARE.add(Character.UnicodeBlock.GURMUKHI); // 果鲁穆奇字母(用于写旁遮普语的字母)果鲁穆奇语
UNI_BLK_RARE.add(Character.UnicodeBlock.GUJARATI); // 古吉拉特语
UNI_BLK_RARE.add(Character.UnicodeBlock.GREEK_EXTENDED);// 希腊语扩展
UNI_BLK_RARE.add(Character.UnicodeBlock.GEORGIAN); // 格鲁吉亚语
UNI_BLK_RARE.add(Character.UnicodeBlock.HANUNOO); // 哈努诺文
UNI_BLK_RARE.add(Character.UnicodeBlock.HEBREW); // 希伯来语
UNI_BLK_RARE.add(Character.UnicodeBlock.KANNADA); // <印> 埃纳德语
UNI_BLK_RARE.add(Character.UnicodeBlock.LAO); // 老挝语
UNI_BLK_RARE.add(Character.UnicodeBlock.LIMBU); // 林布族
UNI_BLK_RARE.add(Character.UnicodeBlock.MONGOLIAN); // 蒙古族语
UNI_BLK_RARE.add(Character.UnicodeBlock.MALAYALAM); // 印度西南部的马拉拉姆(Dravidian)语的一方言
UNI_BLK_RARE.add(Character.UnicodeBlock.MYANMAR); // 缅甸
UNI_BLK_RARE.add(Character.UnicodeBlock.NEW_TAI_LUE); // 泰泐族语
UNI_BLK_RARE.add(Character.UnicodeBlock.RUNIC); // 古代北欧文字
UNI_BLK_RARE.add(Character.UnicodeBlock.SYRIAC); // 古代叙利亚语
UNI_BLK_RARE.add(Character.UnicodeBlock.SINHALA); // 僧伽罗语
UNI_BLK_RARE.add(Character.UnicodeBlock.SUNDANESE); // 巽他人语
UNI_BLK_RARE.add(Character.UnicodeBlock.SAMARITAN); // 撒马利亚语
UNI_BLK_RARE.add(Character.UnicodeBlock.THAI); // 泰语
UNI_BLK_RARE.add(Character.UnicodeBlock.TAMIL); // 泰米尔语
UNI_BLK_RARE.add(Character.UnicodeBlock.TAGBANWA); // 塔格巴努亚文
UNI_BLK_RARE.add(Character.UnicodeBlock.TELUGU); // 泰卢固语(印度东部德拉维拉语言)
UNI_BLK_RARE.add(Character.UnicodeBlock.TIBETAN); // 藏文
UNI_BLK_RARE.add(Character.UnicodeBlock.CURRENCY_SYMBOLS); // 货币符号
UNI_BLK_RARE.add(Character.UnicodeBlock.DINGBATS); // 装饰符
UNI_BLK_RARE.add(Character.UnicodeBlock.SPACING_MODIFIER_LETTERS); // 间距修饰字母
UNI_BLK_RARE.add(Character.UnicodeBlock.GREEK); // 希腊语
UNI_BLK_RARE.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS); // 杂项符号
UNI_BLK_RARE.add(Character.UnicodeBlock.LETTERLIKE_SYMBOLS); // 字母状符号
UNI_BLK_RARE.add(Character.UnicodeBlock.GEOMETRIC_SHAPES); // 几何图形
UNI_BLK_RARE.add(Character.UnicodeBlock.NUMBER_FORMS); // 数字形状(包含了正常的罗马数字)
UNI_BLK_RARE.add(Character.UnicodeBlock.ALPHABETIC_PRESENTATION_FORMS); // 字母表示形状
UNI_BLK_RARE.add(Character.UnicodeBlock.ARROWS); // 2190..21FF; Arrows 箭头符号
// 私有编码、特殊编码区域直接判定为乱码
UNI_BLK_PRIVATE.add(null);
UNI_BLK_PRIVATE.add(Character.UnicodeBlock.PRIVATE_USE_AREA); // E000..F8FF; Private Use Area
UNI_BLK_PRIVATE.add(Character.UnicodeBlock.SUPPLEMENTARY_PRIVATE_USE_AREA_A);
UNI_BLK_PRIVATE.add(Character.UnicodeBlock.SUPPLEMENTARY_PRIVATE_USE_AREA_B);
UNI_BLK_PRIVATE.add(Character.UnicodeBlock.SPECIALS); // FFF0..FFFF; Specials
UNI_BLK_PRIVATE.add(Character.UnicodeBlock.HIGH_SURROGATES); // D800..DB7F; High Surrogates
UNI_BLK_PRIVATE.add(Character.UnicodeBlock.LOW_SURROGATES); // DC00..DFFF; Low Surrogates
// DB80..DBFF; High Private Use Surrogates
UNI_BLK_PRIVATE.add(Character.UnicodeBlock.HIGH_PRIVATE_USE_SURROGATES);
}
// 检查字符串中是否有乱码
for(int codePoint : text.codePoints().toArray()) {
Character.UnicodeBlock uk = Character.UnicodeBlock.of(codePoint);
if(UNI_BLK_PRIVATE.contains(uk)) {
System.err.println(text + " -> " + uk);
}
}