最常用且可靠的方式是用正则表达式匹配unicode中文字符范围,覆盖u4e00–u9fa5和u3400–u4dbf即可满足多数场景;也可用character.unicodeblock判断cjk区块,或用c>127粗筛。

Java 判断字符串是否包含中文,最常用且可靠的方式是使用正则表达式匹配 Unicode 中文字符范围。
用正则表达式判断(推荐)
中文字符在 Unicode 中主要位于 u4e00–u9fa5(基本汉字)、u3400–u4dbf(扩展 A)、u20000–u2a6df(扩展 B,需用代理对处理)、u2a700–u2b73f(扩展 C/D/E)等区间。日常开发中,覆盖前两个常用区即可满足绝大多数场景。
示例代码:
public static boolean containsChinese(String str) {
if (str == null || str.isEmpty()) return false;
return str.matches(".*[\u4e00-\u9fa5\u3400-\u4dbf].*");
}
- 注意:
matches()是全串匹配,所以前后加.* - 如果只需检测是否存在,用
Pattern.compile().matcher().find()效率略高(尤其长字符串) - 若需支持生僻字或古籍用字(如扩展 B),需额外处理 UTF-16 代理对,或改用
Character.isIdeographic(c)配合遍历
用 Character 类逐字符判断
利用 Java 内置的 Unicode 属性判断,更语义化,且天然支持所有表意文字(含日文平假名/片假名、韩文等),但不严格区分“中文”——若业务只要纯中文,慎用。
示例:
public static boolean containsChineseByChar(String str) {
if (str == null) return false;
for (char c : str.toCharArray()) {
if (Character.UnicodeBlock.of(c) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| Character.UnicodeBlock.of(c) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| Character.UnicodeBlock.of(c) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B) {
return true;
}
}
return false;
}
-
CJK_UNIFIED_IDEOGRAPHS对应 u4e00–u9fff,覆盖常用简繁体 - 扩展 A/B 区块需显式列出,否则会被忽略
- 此法不依赖正则,适合对性能和兼容性要求高的场景
简单粗暴但实用的方案
如果项目对“中文”的定义较宽松(比如只要不是 ASCII 字符就算),可直接比较字符编码范围:
public static boolean hasNonAscii(String str) {
if (str == null) return false;
for (char c : str.toCharArray()) {
if (c > 127) return true; // ASCII 最大为 127
}
return false;
}
- 快,但会把日文、韩文、俄文、emoji 等全判为“中文”,仅适用于粗筛或日志过滤等非关键逻辑
- 不能替代真正中文识别,慎用于用户输入校验或内容分类
注意事项
避免常见误区:
- 不要只用
u4e00-u9fff:漏掉繁体、生僻字、标点(如「、」「。」在 u3000–u303f) - 不要用
String.getBytes("UTF-8").length > str.length():中文占多字节,但 emoji、某些符号也占多字节,不可靠 - 正则中勿写成
[\u4e00-\u9fa5]后直接跟字母(如[\u4e00-\u9fa5]abc),容易因贪婪匹配出错;判断存在性优先用find()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











