/**
*
* 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";
private StringUtils() {
}
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;
}
/**
* 拼接指定对象数组为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((Integer) 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;
}
}
}