Character.getType() 返回 Unicode 字符的整数分类码,如 UPPERCASE_LETTER(1)、DECIMAL_DIGIT_NUMBER(9)等;支持 char 和 int codePoint 两种重载,后者兼容增补字符;需配合常量比对使用,不可直接用返回值判断非法字符。
Character.getType()
是 Java 中判断单个字符在 Unicode 标准中所属“通用类别”(General Category)的核心方法。它不返回字符串描述,而是返回一个
int 类型的分类码
,对应 Character 类中定义的静态常量(如
、
等),是底层字符语义识别的基础。
怎么用 getType() 获取字符分类
该方法有两个重载版本:
:仅支持基本多文种平面(BMP)字符,即 code point ≤ 0xFFFF 的字符;
:支持全部 Unicode 字符(包括增补字符,如 emoji、古文字等),推荐在处理不确定来源的文本时使用。
例如:
常见分类常量与实际含义
返回值需与 Character 类中的常量比对才有意义。关键分类包括:
(1):如 'A'、'Ä'、'Λ';
(2):如 'a'、'ñ'、'μ';
(3):较少见,如某些语言中词首大写变体;
(9):ASCII 数字 '0'–'9',也包括全角数字 '0'–'9'(U+FF10–U+FF19);
(10):带圈数字 '①'、罗马数字 'Ⅴ'、上标 '⁴' 等;
(23):如下划线 '_'、连接号 '‑'(U+2011)、水平制表符不在此列;
(12):标准空格 ' '、不换行空格 ' '(U+00A0)等;
(0):Unicode 中尚未分配的码位,
注意:不是“无效字符”
,只是暂未定义。
getType() 和 isXxx() 方法的关系
多数
工具方法内部都基于
实现。例如:
≡
;
≡ 类型为
/
/
/
/
之一;
就是判断
;
但
比
更宽泛——还包含
(如 'Ⅰ'),而后者 getType 返回的是 11,不是 letter 类型。
注意事项与典型误用
使用
时容易忽略的细节:
传入
类型无法正确识别代理对(surrogate pair)表示的增补字符,必须用
形式;
返回值是整数,不能直接打印为可读名称,需配合 switch 或查表映射(如
);
不要用
判断“非法字符”——
才管范围有效性,
为 0 表示“未分配”,仍可能是合法码点;
中文标点、日文平假名、阿拉伯数字等均各有明确分类,不是笼统的 “other” —— 全角 '。' 属于
(24),平假名 'あ' 属于
(2)。
UPPERCASE_LETTERDECIMAL_DIGIT_NUMBERCharacter.getType(char ch)Character.getType(int codePoint)System.out.println(Character.getType('A')); // 输出 1 → 对应 UPPERCASE_LETTER
System.out.println(Character.getType('①')); // 输出 9 → 对应 OTHER_NUMBER
System.out.println(Character.getType(0x1F60A)); // 输出 27 → 对应 EMOJI_MODIFIER_BASE(? 所属类别)UPPERCASE_LETTERLOWERCASE_LETTERTITLECASE_LETTERDECIMAL_DIGIT_NUMBEROTHER_NUMBERCONNECTOR_PUNCTUATIONSPACE_SEPARATORUNASSIGNEDCharacter.isXxx()getType()isDigit(ch)getType(ch) == DECIMAL_DIGIT_NUMBERisLetter(ch)UPPERCASE_LETTERLOWERCASE_LETTERTITLECASE_LETTERMODIFIER_LETTEROTHER_LETTERisDefined(ch)getType(ch) != UNASSIGNEDisAlphabetic(ch)isLetter(ch)LETTER_NUMBERgetType()charint codePointswitch (Character.getType(c)) { case UPPERCASE_LETTER: ... }== 0isValidCodePoint()getType()OTHER_PUNCTUATIONLOWERCASE_LETTER