Loading... * **原理**:将需要过滤的字符串转成 `char`,再提取**英文、英文标点、中文、中文标点**。一般场景下昵称不做限制,内容做限制。 * **改进**:如果要支持所有国家语言只需要让 `Character.UnicodeScript != Character.UnicodeScript.UNKNOWN` ```java import org.apache.commons.lang3.StringUtils; /** * 字符过滤 */ public class CharFilterUtil { /** * 过滤特殊字符 * * @param isZh 是否国内过滤 * @param original 原始字符串 * @return {@link String} */ public static String filterSpecialCharacter(Boolean isZh, String original) { if (StringUtils.isBlank(original)) { return ""; } char[] arr = original.toCharArray(); StringBuilder sb = new StringBuilder(); for (char c : arr) { if (isValidChar(isZh, c)) { sb.append(c); } } return sb.toString(); } /** * 是否有效字符 * * @param ch ch * @param isZh 是否中文 * @return boolean */ private static boolean isValidChar(Boolean isZh, char ch) { if (ch == '=' || ch == '+') { return true; } if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { return true; } if (isZh) { // 简体中文汉字编码 if (isChineseByScript(ch)) { return true; } } else { // 只要不是UnicodeScript中未知的,国外编码都通过 if (isForeignByScript(ch)) { return true; } } // 中英文标点符号 return RegExp.contains("\\pP", Character.toString(ch)); } /** * 使用UnicodeScript方法判断 * * @param c c * @return boolean */ private static boolean isChineseByScript(char c) { Character.UnicodeScript sc = Character.UnicodeScript.of(c); return sc == Character.UnicodeScript.HAN; } /** * 是外国脚本 * * @param c c * @return boolean */ private static boolean isForeignByScript(char c) { Character.UnicodeScript sc = Character.UnicodeScript.of(c); return sc != Character.UnicodeScript.UNKNOWN; } } ``` Last modification:August 22, 2022 © Allow specification reprint Like 0 喵ฅฅ