Java 判断中文及标点符号

       开发中需要判断某个字符或者字符串是中文还是英文,从而做相应的处理,大多数会用到正则来判断的,其实也可以使用 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~

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值