Java通过Unicode编码过滤特殊字符

首先,U+10000及以上的字符被称为增补字符。在Java中,增补字符使用两个char变量来表示,所以过滤特殊字符的时候,可以首先过滤掉这些增补字符,过程非常简单:

    /**
     * 判断字符串里是否包含增补字符
     * @param str
     * @return true 包含增补字符 false 不包含增补字符
     */
    public static boolean supplementChar(String str) {
        int len = str.length();
        return len != str.codePointCount(0,len);
    }

String类里有一个计算字符串代码点数量的方法,如果一个字符串里包含增补字符,那么该字符串的长度(char数量)不等于该字符串代码点的数量(因为增补字符由两个char组成)。

过滤掉增补字符后,可以通过限制Unicode编码的区间,来过滤掉区间外的字符。具体Unicode各个区间的含义可以参考这里

    /**
     * 选定的Unicode区间
     */
	public static String range = "0000-007F;2E80-2EFF;3000-303F;3400-4DBF;4E00-9FBF;F900-FAFF";
    /**
     * 判断字符串的字符是否在指定Unicode区间
     * @param str
     * @return true 在指定区间 false 不在指定区间
     */
    public static boolean unicodeRange(String str) {
        String[] ranges = range.split(";");
        char[] chars= str.toCharArray();
        for (char c : chars) {
            // 记录是否合法,0 不合法 1 合法
            int flag = 0;
            // 遍历所有区间
            for (String s : ranges) {
                String[] compare = s.split("-");
                // 合法字符,跳出
                if (c >= Integer.parseInt(compare[0], 16) && c <= Integer.parseInt(compare[1], 16)) {
                    flag = 1;
                    break;
                }
            }
            // 有不合法的字符,返回false
            if (flag == 0) {
                return false;
            }
        }
        return true;
    }

通过以上方法,就可以过滤出来特殊字符了,如果想过滤地更加精确,细分一下Unicode编码的区间就可以了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中去除特殊Unicode编码,可以使用正则表达式的replaceAll方法。首先,根据参考文献的思路,可以使用以下代码来去除Unicode编码的空格: ```java private String repSpace(String src){ return src.replaceAll("[\\pZ]", ""); } ``` 其中,`\\pZ`表示Unicode属性中的分隔符,包括空格等。这样,可以将字符串中的特殊Unicode编码的空格去除掉。 另外,如果要限制Unicode编码的区间来过滤掉区间外的字符,可以使用以下代码: ```java public static String range = "0000-007F;2E80-2EFF;3000-303F;3400-4DBF;4E00-9FBF;F900-FAFF"; public static boolean unicodeRange(String str) { String[] ranges = range.split(";"); char[] chars= str.toCharArray(); for (char c : chars) { int flag = 0; for (String s : ranges) { String[] compare = s.split("-"); if (c >= Integer.parseInt(compare<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java通过Unicode编码过滤特殊字符](https://blog.csdn.net/dsh153/article/details/107363908)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java去掉Unicode特殊字符](https://blog.csdn.net/pang9998/article/details/101169998)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值