/** * * Copyright 2008 - 2012 * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * @project loon * @author cping * @email:javachenpeng@yahoo.com * @version 0.3.3 */ package loon.utils; import java.io.UnsupportedEncodingException; import java.util.StringTokenizer; final public class StringUtils { public static final String ASCII_CHARSET = "US-ASCII"; public static final String ISO88591_CHARSET = "ISO-8859-1"; public final static boolean startsWith(String n, char tag) { return n.charAt(0) == tag; } public final static boolean endsWith(String n, char tag) { return n.charAt(n.length() - 1) == tag; } private StringUtils() { } /** * 拼接指定对象数组为String * * @param res * @return */ public static String concat(Object... res) { StringBuffer sbr = new StringBuffer(res.length); for (int i = 0; i < res.length; i++) { if (res[i] instanceof Integer) { sbr.append(res[i]); } else { sbr.append(res[i]); } } return sbr.toString(); } /** * 判定是否由纯粹的西方字符组成 * * @param string * @return */ public static boolean isEnglishAndNumeric(String string) { if (string == null || string.length() == 0) { return false; } char[] chars = string.toCharArray(); int size = chars.length; for (int j = 0; j < size; j++) { char letter = chars[j]; if ((97 > letter || letter > 122) && (65 > letter || letter > 90) && (48 > letter || letter > 57)) { return false; } } return true; } /** * 判定是否为半角符号 * * @param c * @return */ public static boolean isSingle(final char c) { return (':' == c || ':' == c) || (',' == c || ',' == c) || ('"' == c || '“' == c) || ((0x0020 <= c) && (c <= 0x007E) && !((('a' <= c) && (c <= 'z')) || (('A' <= c) && (c <= 'Z'))) && !('0' <= c) && (c <= '9')); } /** * 分解字符串 * * @param string * @param tag * @return */ public static String[] split(final String string, final String tag) { StringTokenizer str = new StringTokenizer(string, tag); String[] result = new String[str.countTokens()]; int index = 0; for (; str.hasMoreTokens();) { result[index++] = str.nextToken(); } return result; } /** * 过滤指定字符串 * * @param string * @param oldString * @param newString * @return */ public static final String replace(String string, String oldString, String newString) { if (string == null) return null; if (newString == null) return string; int i = 0; if ((i = string.indexOf(oldString, i)) >= 0) { char string2[] = string.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buf = new StringBuffer(string2.length); buf.append(string2, 0, i).append(newString2); i += oLength; int j; for (j = i; (i = string.indexOf(oldString, i)) > 0; j = i) { buf.append(string2, j, i - j).append(newString2); i += oLength; } buf.append(string2, j, string2.length - j); return buf.toString(); } else { return string; } } /** * 不匹配大小写的过滤指定字符串 * * @param line * @param oldString * @param newString * @return */ public static final String replaceIgnoreCase(String line, String oldString, String newString) { if (line == null) return null; String lcLine = line.toLowerCase(); String lcOldString = oldString.toLowerCase(); int i = 0; if ((i = lcLine.indexOf(lcOldString, i)) >= 0) { char line2[] = line.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buf = new StringBuffer(line2.length); buf.append(line2, 0, i).append(newString2); i += oLength; int j; for (j = i; (i = lcLine.indexOf(lcOldString, i)) > 0; j = i) { buf.append(line2, j, i - j).append(newString2); i += oLength; } buf.append(line2, j, line2.length - j); return buf.toString(); } else { return line; } } /** * 不匹配大小写的过滤指定字符串 * * @param line * @param oldString * @param newString * @param count * @return */ public static final String replaceIgnoreCase(String line, String oldString, String newString, int count[]) { if (line == null) return null; String lcLine = line.toLowerCase(); String lcOldString = oldString.toLowerCase(); int i = 0; if ((i = lcLine.indexOf(lcOldString, i)) >= 0) { int counter = 1; char line2[] = line.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buf = new StringBuffer(line2.length); buf.append(line2, 0, i).append(newString2); i += oLength; int j; for (j = i; (i = lcLine.indexOf(lcOldString, i)) > 0; j = i) { counter++; buf.append(line2, j, i - j).append(newString2); i += oLength; } buf.append(line2, j, line2.length - j); count[0] = counter; return buf.toString(); } else { return line; } } /** * 以指定条件过滤字符串 * * @param line * @param oldString * @param newString * @param count * @return */ public static final String replace(String line, String oldString, String newString, int count[]) { if (line == null) return null; int i = 0; if ((i = line.indexOf(oldString, i)) >= 0) { int counter = 1; char line2[] = line.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buf = new StringBuffer(line2.length); buf.append(line2, 0, i).append(newString2); i += oLength; int j; for (j = i; (i = line.indexOf(oldString, i)) > 0; j = i) { counter++; buf.append(line2, j, i - j).append(newString2); i += oLength; } buf.append(line2, j, line2.length - j); count[0] = counter; return buf.toString(); } else { return line; } } /** * 检查一组字符串是否完全由中文组成 * * @param str * @return */ public static boolean isChinaLanguage(char[] chars) { int[] ints = new int[2]; boolean isChinese = false; int length = chars.length; byte[] bytes = null; for (int i = 0; i < length; i++) { bytes = ("" + chars[i]).getBytes(); if (bytes.length == 2) { ints[0] = bytes[0] & 0xff; ints[1] = bytes[1] & 0xff; if (ints[0] >= 0x81 && ints[0] <= 0xFE && ints[1] >= 0x40 && ints[1] <= 0xFE) { isChinese = true; } } else { return false; } } return isChinese; } public static boolean isChinese(char c) { return c >= 0x4e00 && c <= 0x9fa5; } /** * 判断是否为null * * @param param * @return */ public static boolean isEmpty(String param) { return param == null || param.length() == 0 || param.trim().equals(""); } /** * 检查指定字符串中是否存在中文字符。 * * @param checkStr * 指定需要检查的字符串。 * @return 逻辑值(True Or False)。 */ public static final boolean hasChinese(String checkStr) { boolean checkedStatus = false; boolean isError = false; String spStr = " _-"; int checkStrLength = checkStr.length() - 1; for (int i = 0; i <= checkStrLength; i++) { char ch = checkStr.charAt(i); if (ch < '\176') { ch = Character.toUpperCase(ch); if (((ch < 'A') || (ch > 'Z')) && ((ch < '0') || (ch > '9')) && (spStr.indexOf(ch) < 0)) { isError = true; } } } checkedStatus = !isError; return checkedStatus; } /** * 检查是否为纯字母 * * @param value * @return */ public final static boolean isAlphabet(String value) { if (value == null || value.length() == 0) return false; for (int i = 0; i < value.length(); i++) { char c = Character.toUpperCase(value.charAt(i)); if ('A' <= c && c <= 'Z') return true; } return false; } /** * 检查是否为字母与数字混合 * * @param value * @return */ public static boolean isAlphabetNumeric(String value) { if (value == null || value.trim().length() == 0) return true; for (int i = 0; i < value.length(); i++) { char letter = value.charAt(i); if (('a' > letter || letter > 'z') && ('A' > letter || letter > 'Z') && ('0' > letter || letter > '9')) return false; } return true; } /** * 替换指定字符串 * * @param line * @param oldString * @param newString * @return */ public static String replaceMatch(String line, String oldString, String newString) { int i = 0; int j = 0; if ((i = line.indexOf(oldString, i)) >= 0) { char line2[] = line.toCharArray(); char newString2[] = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buffer = new StringBuffer(line2.length); buffer.append(line2, 0, i).append(newString2); i += oLength; for (j = i; (i = line.indexOf(oldString, i)) > 0; j = i) { buffer.append(line2, j, i - j).append(newString2); i += oLength; } buffer.append(line2, j, line2.length - j); return buffer.toString(); } else { return line; } } /** * 获得特定字符总数 * * @param str * @param chr * @return */ public static int charCount(String str, char chr) { int count = 0; if (str != null) { int length = str.length(); for (int i = 0; i < length; i++) { if (str.charAt(i) == chr) { count++; } } return count; } return count; } public static byte[] getAsciiBytes(String data) { if (data == null) { throw new IllegalArgumentException("Parameter may not be null"); } try { return data.getBytes(ASCII_CHARSET); } catch (UnsupportedEncodingException e) { } throw new RuntimeException("LGame requires ASCII support"); } public static String getAsciiString(byte[] data, int offset, int length) { if (data == null) { throw new IllegalArgumentException("Parameter may not be null"); } try { return new String(data, offset, length, ASCII_CHARSET); } catch (UnsupportedEncodingException e) { } throw new RuntimeException("LGame requires ASCII support"); } public static String getAsciiString(byte[] data) { return getAsciiString(data, 0, data.length); } public static String unescape(String escaped) { int length = escaped.length(); int i = 0; StringBuilder sb = new StringBuilder(escaped.length() / 2); while (i < length) { char n = escaped.charAt(i++); if (n != '%') { sb.append(n); } else { n = escaped.charAt(i++); int code; if (n == 'u') { String slice = escaped.substring(i, i + 4); code = Integer.valueOf(slice, 16); i += 4; } else { String slice = escaped.substring(i - 1, ++i); code = Integer.valueOf(slice, 16); } sb.append((char) code); } } return sb.toString(); } public static String escape(String raw) { int length = raw.length(); int i = 0; StringBuilder sb = new StringBuilder(raw.length() / 2); while (i < length) { char c = raw.charAt(i++); if (isLetterOrDigit(c) || isEscapeExempt(c)) { sb.append(c); } else { int i1 = raw.codePointAt(i - 1); String escape = Integer.toHexString(i1); sb.append('%'); if (escape.length() > 2) { sb.append('u'); } sb.append(escape.toUpperCase()); } } return sb.toString(); } private static boolean isLetterOrDigit(char ch) { return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9'); } private static boolean isEscapeExempt(char c) { switch (c) { case '*': case '@': case '-': case '_': case '+': case '.': case '/': return true; default: return false; } } }