`

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编码完美的判断中文汉字和符号 * @param c 要判断的 字符 * @return boolean */ private static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); ...

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

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

    java源码包4

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

    JAVA上百实例源码以及开源项目源代码

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

    java源码包3

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

    JAVA上百实例源码以及开源项目

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

    java源码包2

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

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

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

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

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

    33道题.doc

    * 就需要通过一个判断,如果这个字符不存在,就将key以及对于value存入. * (如果已经存在,说明这个字符遍历的已经不是最大的value值了) * 4.当这个map集合把元素都存入之后,再通过EntrySet()将这个关系对遍历...

    APKTool批处理版l

    APK程序在处理字符串资源时会先判断语言环境,然后自己调用对应语言的。可是,有的程序员会自觉不自觉地,将部分文字内容写到程序代码里面,因此就出现了在资源文件中找不到的词条了。 对这部分词条的修改,相对就...

    给网站制作一个完美的优化方案

    从而判断我们的网站优化是否成功,这也是站长们想看到的最终结果。  第二:定位对手网站。自身的网站分析完后,并可定出网站的主关键词,主关键词定好后,就是要通过这个关键词找到网站的对手,在搜索引擎输入相应...

    leetcode添加元素使和等于-Programming-tips:这几个编程小技巧,让你代码效率提高一个档次

    第二种方法用一个额外变量len避免了每次条件判断都要重复执行函数strlen(s),而执行该函数是非常耗时的(假设字符串的长度为n,函数执行的复杂度为O(n)),尤其是当for循环体的语句比较少,字符串比较长的时候。...

    数据挖掘与数据分析.pdf

    Java:使⽤范围最⼴的编程语⾔,有很多社区进⾏交流,进⾏编程实现具有灵活⾼效的特点,不⾜之处就是实现功能的代码量较⼤(相对于 其他数据挖掘编程语⾔)。 Scala: ⼀种具有⾯向对象风格、函数式风格、更⾼层的...

    算法导论(part1)

    书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...

    算法导论(part2)

    书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...

    asp.net知识库

    如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    面向对象的思想方法已经非常流行了,在编程语言(例如java,js)中,都运用面向对象的编程思想。在XML中,就是要将网页也作为一个对象来操作和控制,我们可以建立自己的对象和模板。与对象进行交流,如何命令对象,...

Global site tag (gtag.js) - Google Analytics