前几天我问题个问题,如何判定字符串是否汉字(原帖:http://bbs.csdn.net/topics/391828774),很多人都给我的代码是调用正则表达式,可是大家都应该懂的,java对正则表达式支持实在太弱,小生怎么整都报错出问题无奈,找了半天搞了个函数解决喽问题可是我比较喜欢知其然也要知其所以然,不懂这个函数判定的过程原理求专业的来详细解释下。
/*判断是否为汉字*/
public boolean vd(String str){
char[] chars=str.toCharArray();
boolean isGB2312=false;
for(int i=0;i<chars.length;i++){
byte[] bytes=(""+chars[i]).getBytes();
if(bytes.length==2){
int[] ints=new int[2];
ints[0]=bytes[0]& 0xff;
ints[1]=bytes[1]& 0xff;
if(ints[0]>=0x81 && ints[0]<=0xFE &&
ints[1]>=0x40 && ints[1]<=0xFE){
isGB2312=true;
break;
}
}
}
return isGB2312;
}
------解决思路----------------------
正则一句话解决的问题
String s="个噶的风格啊";
System.out.println(s.matches("[\u4e00-\u9fa5]+"));
------解决思路----------------------
mathes: 判断字符是否与指定的 正则表达式 相匹配。
定义如下:
public boolean matches(String regex);
举个简单的例子matches
String s= "个噶的风格啊";
System.out.println(s.matches("[\u4e00-\u9fa5]+");
就是用正则表达式来判断s里面的字符串与正则表达式是否相匹配
\u4e00-\u9fa5;这两个unicode值正好是Unicode表中的汉字的头和尾。
------解决思路----------------------
1、包含有汉字:
System.out.println("How are you?我很好, Thank you.".matches("[\u4e00-\u9fa5]+"));
2、全是汉字:
System.out.println("How are you?我很好, Thank you.".matches("^[\u4e00-\u9fa5]+$"));
------解决思路----------------------
这个原理涉及到字符编码。字符编码方式决定一个字符的id,以及如何将id与字节数据相互转化。
如果汉字的id位于某个范围内,或者汉字的id转换成字节数据后有某种特征,那么我们就可以判断字符是否是汉字了。
------解决思路----------------------
1、把字符串转为字符数组,将字符转为int类型,判断该int值的返回时候落在中文Unicode编码范围中
2、自己建立一个中文字典,从字典中判断就行了
------解决思路----------------------
java的正则似乎并不弱,不管是正则还是你的代码原理是一样的,根据字符编码确定。
由于中文是双字节,而根据国标编码(GB2312),如果是中文的话,双字节的高位(如果视为有符号数的就是符号位)都应该是0
------解决思路----------------------
JAVA的正则强大得很.特别很多涉及到String处理的方法都有正则的存在.
特别如果正则写得好的话可以很简单快捷的处理一些需要用其他方法很难处理的复杂问题.
package net.csdn.question;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test{
public static void main(String[] args){
String regex = "([\u4e00-\u9fa5])";
Pattern pattern = Pattern.compile(regex);
String content = "Hello,World!这zhe是shi测ce试shi";
Matcher matcher = pattern.matcher(content);
while(matcher.find()){
System.out.println(matcher.group(1));
}
}
}