Character.getType() 返回 Unicode 字符的整数分类码,如 UPPERCASE_LETTER(1)、DECIMAL_DIGIT_NUMBER(9)等;支持 char 和 int codePoint 两种重载,后者兼容增补字符;需配合常量比对使用,不可直接用返回值判断非法字符。

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










