开发中需要判断某个字符或者字符串是中文还是英文,从而做相应的处理,大多数会用到正则来判断的,其实也可以使用 Java 来判断。
Java Character 实现Unicode字符集介绍 CJK中文字符和中文标点等判断。此外,该类提供了用于确定字符的分类的几种方法(小写字母,数字,等)和由大写转换为小写字符,反之亦然。
Unicode中文范围参考文章:http://www.iteye.com/topic/558050
汉字:[0x4e00,0x9fa5](或十进制[19968,40869])
数字:[0x30,0x39](或十进制[48, 57])
小写字母:[0x61,0x7a](或十进制[97, 122])
大写字母:[0x41,0x5a](或十进制[65, 90])
在Java中,主要使用 Character类处理字符有关功能,Character 类中有3个静态内部类:
UnicodeBlock 与 UnicodeScript 关系:
1、UnicodeScript实现是在Java 7中新引入,UnicodeScript 是从语言书写规则层次对Unicode字符的分类,
2.、在一个 UnicodeScript中的字符可能分散在多个UnicodeBlock中;
3.、一个 UnicodeBlock中的字符可能会被划进多个UnicodeScript中。
中文的标点符号主要存在于以下5个UnicodeBlock中:
- U2000-General Punctuation (百分号,千分号,单引号,双引号等)
- U3000-CJK Symbols and Punctuation ( 顿号,句号,书名号,〸,〹,〺 等;PS: 后面三个字符你知道什么意思吗? : ) )
- UFF00-Halfwidth and Fullwidth Forms ( 大于,小于,等于,括号,感叹号,加,减,冒号,分号等等)
- UFE30-CJK Compatibility Forms (主要是给竖写方式使用的括号,以及间断线﹉,波浪线﹌等)
- UFE10-Vertical Forms (主要是一些竖着写的标点符号, 等等)
import java.util.regex.Pattern;
/**
* @Description: 判断中文(汉字和标点符号)与英文工具类
* @Date: 2020-04-24 15:43
* @Version: V1.0
*/
public class ChineseAndEnglishUtils {
private ChineseAndEnglishUtils() {
}
/**
* 使用UnicodeBlock方法判断是否存在中文(包括汉字, 标点符号判断)
*
* @param str
* @return true-存在,false-不存在
*/
public static boolean checkChinesePunctuationByScript(String str) {
if (str == null) {
return false;
}
char[] chars = str.toCharArray();
for (char aChar : chars) {
if (isChineseByScript(aChar)) {
return true;
}
}
return false;
}
/**
* 使用UnicodeScript方法判断是否存在中文(包括汉字, 标点符号判断)
*
* @param str
* @return true-存在,false-不存在
*/
public static boolean checkChinesePunctuationByBlock(String str) {
if (str == null) {
return false;
}
char[] chars = str.toCharArray();
for (char aChar : chars) {
if (isChineseByBlock(aChar)) {
return true;
}
}
return false;
}
/**
* 使用Unicode编码范围来判断是否存在汉字, 标点符号不做判断
*
* @param str
* @return true-存在,false-不存在
*/
public static boolean checkChineseByUnicodeRange(String str) {
if (str == null) {
return false;
}
String regEx = "[\\u4e00-\\u9fa5]+";
Pattern pattern = Pattern.compile(regEx);
return pattern.matcher(str.trim()).find();
}
/**
* 使用UnicodeBlock方法判断是否存在汉字, 标点符号不做判断
*
* @param c
* @return true-存在,false-不存在
*/
public static boolean isChineseByBlock(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT) {
return true;
} else {
return false;
}
}
/**
* 使用UnicodeScript方法判断是否存在汉字, 标点符号不做判断
*
* @param c
* @return true-存在,false-不存在
*/
public static boolean isChineseByScript(char c) {
Character.UnicodeScript sc = Character.UnicodeScript.of(c);
if (sc == Character.UnicodeScript.HAN) {
return true;
}
return false;
}
/**
* 根据UnicodeBlock方法判断中文标点符号
*
* @param c
* @return true-存在,false-不存在
*/
public static boolean isChinesePunctuation(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_FORMS
|| ub == Character.UnicodeBlock.VERTICAL_FORMS) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
System.out.println("=====使用Unicode编码范围来判断是否存在汉字, 标点符号不做判断======");
System.out.println("abc中国,.d==" + checkChineseByUnicodeRange("abc中国,.d"));
System.out.println("abc中d==" + checkChineseByUnicodeRange("abc中d"));
System.out.println("abc,.d==" + checkChineseByUnicodeRange("abc,.d"));
System.out.println("=====使用UnicodeBlock方法判断是否存在中文(包括汉字, 标点符号判断)=====");
System.out.println("abc中国,.d==" + checkChinesePunctuationByBlock("abc中国,.d"));
System.out.println("abc中d==" + checkChinesePunctuationByBlock("abc中d"));
System.out.println("abc,.d==" + checkChinesePunctuationByBlock("abc,.d"));
System.out.println("=====使用UnicodeScript方法判断是否存在中文(包括汉字, 标点符号判断)=====");
System.out.println("abc中国,.d==" + checkChinesePunctuationByScript("abc中国,.d"));
System.out.println("abc中d==" + checkChinesePunctuationByScript("abc中d"));
System.out.println("abc,.d==" + checkChinesePunctuationByScript("abc,.d"));
System.out.println("=====根据UnicodeBlock方法判断中文标点符号=====");
System.out.println(".==" + isChinesePunctuation('.'));
System.out.println("。==" + isChinesePunctuation('。'));
}
}
ends~