`

Java 完美判断中文字符

阅读更多

Java判断一个字符串是否有中文一般情况是利用Unicode编码(CJK统一汉字的编码区间:0x4e00–0x9fbb)的正则来做判断,但是其实这个区间来判断中文不是非常精确,因为有些中文的标点符号比如:,。等等是不能识别的。

以下是比较完善的判断方法:CharUtil.java

 

package com.micmiu.utils;

import java.util.regex.Pattern;

/**
 * 字符通用工具类
 * 
 * @author <a href="http://www.micmiu.com">Michael Sun</a>
 */
public class CharUtil {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String[] strArr = new String[] { "www.micmiu.com",
				"!@#$%^&*()_+{}[]|\"'?/:;<>,.", "!¥……()——:;“”‘’《》,。?、", "不要啊",
				"やめて", "韩佳人", "한가인" };
		for (String str : strArr) {
			System.out.println("===========> 测试字符串:" + str);
			System.out.println("正则判断:" + isChineseByREG(str) + " -- "
					+ isChineseByName(str));
			System.out.println("Unicode判断结果 :" + isChinese(str));
			System.out.println("详细判断列表:");
			char[] ch = str.toCharArray();
			for (int i = 0; i < ch.length; i++) {
				char c = ch[i];
				System.out.println(c + " --> " + (isChinese(c) ? "是" : "否"));
			}
		}

	}

	// 根据Unicode编码完美的判断中文汉字和符号
	private static boolean isChinese(char c) {
		Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
		if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
				|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
				|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
				|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
				|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
			return true;
		}
		return false;
	}

	// 完整的判断中文汉字和符号
	public static boolean isChinese(String strName) {
		char[] ch = strName.toCharArray();
		for (int i = 0; i < ch.length; i++) {
			char c = ch[i];
			if (isChinese(c)) {
				return true;
			}
		}
		return false;
	}

	// 只能判断部分CJK字符(CJK统一汉字)
	public static boolean isChineseByREG(String str) {
		if (str == null) {
			return false;
		}
		Pattern pattern = Pattern.compile("[\\u4E00-\\u9FBF]+");
		return pattern.matcher(str.trim()).find();
	}

	// 只能判断部分CJK字符(CJK统一汉字)
	public static boolean isChineseByName(String str) {
		if (str == null) {
			return false;
		}
		// 大小写不同:\\p 表示包含,\\P 表示不包含 
		// \\p{Cn} 的意思为 Unicode 中未被定义字符的编码,\\P{Cn} 就表示 Unicode中已经被定义字符的编码
		String reg = "\\p{InCJK Unified Ideographs}&&\\P{Cn}";
		Pattern pattern = Pattern.compile(reg);
		return pattern.matcher(str.trim()).find();
	}
}

 

运行结果如下:

===========> 测试字符串:www.micmiu.com
正则判断:false -- false
Unicode判断结果 :false
详细判断列表:
w --> 否
w --> 否
w --> 否
. --> 否
m --> 否
i --> 否
c --> 否
m --> 否
i --> 否
u --> 否
. --> 否
c --> 否
o --> 否
m --> 否
===========> 测试字符串:!@#$%^&*()_+{}[]|"'?/:;<>,.
正则判断:false -- false
Unicode判断结果 :false
详细判断列表:
! --> 否
@ --> 否
# --> 否
$ --> 否
% --> 否
^ --> 否
& --> 否
* --> 否
( --> 否
) --> 否
_ --> 否
+ --> 否
{ --> 否
} --> 否
[ --> 否
] --> 否
| --> 否
" --> 否
' --> 否
? --> 否
/ --> 否
: --> 否
; --> 否
< --> 否
> --> 否
, --> 否
. --> 否
===========> 测试字符串:!¥……()——:;“”‘’《》,。?、
正则判断:false -- false
Unicode判断结果 :true
详细判断列表:
! --> 是
¥ --> 是
… --> 是
… --> 是
( --> 是
) --> 是
— --> 是
— --> 是
: --> 是
; --> 是
“ --> 是
” --> 是
‘ --> 是
’ --> 是
《 --> 是
》 --> 是
, --> 是
。 --> 是
? --> 是
、 --> 是
===========> 测试字符串:不要啊
正则判断:true -- false
Unicode判断结果 :true
详细判断列表:
不 --> 是
要 --> 是
啊 --> 是
===========> 测试字符串:やめて
正则判断:false -- false
Unicode判断结果 :false
详细判断列表:
や --> 否
め --> 否
て --> 否
===========> 测试字符串:韩佳人
正则判断:true -- false
Unicode判断结果 :true
详细判断列表:
韩 --> 是
佳 --> 是
人 --> 是
===========> 测试字符串:한가인
正则判断:false -- false
Unicode判断结果 :false
详细判断列表:
한 --> 否
가 --> 否
인 --> 否


转自:http://www.micmiu.com/lang/java/java-check-chinese/
http://lwjlaser.iteye.com/blog/963211

分享到:
评论

相关推荐

    Java 完美判断中文字符的方法

    在Java编程语言中,判断一个字符串是否包含中文字符通常涉及到对Unicode编码的理解。中文字符主要集中在Unicode的CJK统一汉字区,但简单的Unicode编码区间判断可能会出现不准确的情况,特别是对于中文标点符号等特殊...

    字符串(汉字)长度判断

    * 根据Unicode编码完美的判断中文汉字和符号 * @param c 要判断的 字符 * @return boolean */ private static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); ...

    Java精确截取字符串.pdf

    这种方法虽然能够较好地处理中文字符的截取,但并不完美。在处理多语言混合的字符串时,可能需要使用UTF-8等其他编码方式,同时考虑到不同语言字符的字节长度差异。此外,还可以使用Java的`Character`类的`...

    java完美的验证码生成

    - 英文字母验证码:扩展到包括大小写字母,可以使用`Character.isLetter()`来判断字符是否为字母。 - 中文验证码:需要用到Unicode编码,通过随机选择汉字的Unicode范围(如\u4e00-\u9fff)来生成中文字符。 2. *...

    人民币大小写转换java完美版(媲美商用版)

    本示例中的"人民币大小写转换java完美版"就是一个典型的实例,它解决了在Java编程中将数字金额转换为大写的汉字金额,这对于银行系统、财务软件或上机作业来说是至关重要的功能。下面我们将深入探讨这个主题,讲解...

    java源码包---java 源码 大量 实例

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    Java实现中文转拼音.rar

    在Java编程语言中,将中文汉字转换为拼音是一项常见的任务,尤其在文本处理、搜索优化或者国际化应用中。本资源“Java实现中文转拼音.rar”提供了一个Java工具类,能够帮助开发者实现这一功能。下面我们将深入探讨这...

    java源码包3

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java调用shell脚本完美封装

    本文将详细介绍如何在Java中完美封装shell脚本的调用方法,并提供相关的测试示例。 1. **Java与Shell脚本的桥梁:Runtime类和ProcessBuilder类** Java提供了两种主要的方式来调用外部程序,包括Shell脚本:`...

    java源码包2

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    正则表达式对字符串的完美验证

    接着,`matcher.matches()`判断整个字符串是否匹配,`matcher.start()`和`matcher.end()`分别获取匹配的起始和结束索引。`Matcher.find()`则用于查找下一个匹配的子串,而`Matcher.group()`返回当前匹配的子串。 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...

    最新精品JAVA高级备课完美版——Java基本数据类型[参考].pdf

    转义字符在Java中也是常见的,例如`\n`表示换行,`\t`表示制表符。 3. 整数类:Java提供了四种整数类型:`byte`、`short`、`int`和`long`,分别用于存储不同范围的整数值。所有整数类型都是带符号的,即可以表示...

    java源码包4

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    JAVA面试题及答案参考,JAVA面试前刷刷题

    将这个字符串中的连续子串用同等长度的仅包含 WASD 的字符串替换 Q,如果替换后整个字符串中 WASD 四个字母出现的频数相同,那么我们称替换后的字符串是“完美走位”。求子串的最小长度。如果输入字符串已经平衡则...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...

    java操作时间工具类

    但是,由于这个类的设计并不完美,存在线程安全问题以及不支持国际化等问题,所以在Java 8之后,已经不再推荐使用。 2. `java.text.SimpleDateFormat`:这是一个具体的日期时间格式化类,用于将日期或时间格式化为...

    开发语言判断器,可以判断是那种语言开发的程序

    值得注意的是,虽然开发语言判断器在大多数情况下能准确识别语言,但并非所有情况都能完美应对。例如,混合语言的代码、高度混淆的代码或者使用非标准文件扩展名的代码可能会给判断器带来挑战。此外,对于一些动态...

    《疯狂JAVA讲义》课后习题之输出近似圆源码

    这个任务涉及到一些基本的数学知识,以及Java编程中的字符数组处理。 首先,我们知道在计算机屏幕上,我们无法直接绘制出完美的圆形,因为屏幕是由像素点组成的,而每个像素点都是正方形。为了在控制台上近似地表示...

Global site tag (gtag.js) - Google Analytics