package com.happy.Unitil_elc;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.BreakIterator;
import java.text.DecimalFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringUtil {
/** 空字符串。 */
public static final String EMPTY_STRING = "";
private static final char QUOTE_ENCODE[] = """.toCharArray();
private static final char AMP_ENCODE[] = "&".toCharArray();
private static final char LT_ENCODE[] = "<".toCharArray();
private static final char GT_ENCODE[] = ">".toCharArray();
private static final int DUMP_HEX_CHAR_COUNT = 75;
private static MessageDigest digest = null;
// private static final int fillchar = 61;
private static Random randGen = new Random();
private static char numbersAndLetters[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
private static final char zeroArray[] = "0000000000000000".toCharArray();
private static final char[] base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
private static final char[] upcaseHexChar = "0123456789ABCDEF".toCharArray();
private static final char[] lowerHexChar = "0123456789abcdef".toCharArray();
private static int[] hexCharCodes = new int[256];
private static int[] base64Codes = new int[256];
static {
for (int i = 0; i < 256; i++)
hexCharCodes[i] = base64Codes[i] = -1;
for (int i = 0; i < base64Chars.length; i++)
base64Codes[base64Chars[i]] = (byte) i;
for (int i = 0; i < upcaseHexChar.length; i++)
hexCharCodes[upcaseHexChar[i]] = (byte) i;
for (int i = 0; i < lowerHexChar.length; i++)
hexCharCodes[lowerHexChar[i]] = (byte) i;
}
/**
* 如果字符串是null,则返回指定默认字符串,否则返回字符串本身。
*
*
* StringUtil.defaultIfNull(null, "default") = "default"
* StringUtil.defaultIfNull("", "default") = ""
* StringUtil.defaultIfNull(" ", "default") = " "
* StringUtil.defaultIfNull("bat", "default") = "bat"
*
*
* @param str 要转换的字符串
* @param defaultStr 默认字符串
* @return 字符串本身或指定的默认字符串
*/
public static String defaultIfNull(String str, String defaultStr) {
return (str == null) ? defaultStr : str;
}
public static boolean isDigits(String str) {
if ((str == null) || (str.length() == 0)) {
return false;
}
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
}
public static boolean isDigits(Object obj) {
if (obj == null) return false;
String str = obj.toString();
return isDigits(str);
}
public static final String escapeHTMLTags(String in) {
if (in == null) return null;
int i = 0;
int last = 0;
char input[] = in.toCharArray();
int len = input.length;
StringBuffer out = new StringBuffer((int) ((double) len * 1.3D));
for (; i < len; i++) {
char ch = input[i];
if (ch > '>') continue;
if (ch == '<') {
if (i > last) out.append(input, last, i - last);
last = i + 1;
out.append(LT_ENCODE);
continue;
}
if (ch != '>') continue;
if (i > last) out.append(input, last, i - last);
last = i + 1;
out.append(GT_ENCODE);
}
if (last == 0) return in;
if (i > last) out.append(input, last, i - last);
return out.toString();
}
public static final synchronized String hash(String data) {
if (digest == null) try {
digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsae) {
System.err.println("Failed to load the MD5 MessageDigest. We will be unable to function normally.");
nsae.printStackTrace();
}
digest.update(data.getBytes());
return encodeHex(digest.digest());
}
public static final String encodeHex(byte bytes[]) {
char[] buf = new char[bytes.length * 2];
for (int i = 0; i < bytes.length; i++) {
int code = bytes[i] & 0xff;
buf[2 * i] = upcaseHexChar[code >> 4];
buf[2 * i + 1] = upcaseHexChar[code & 0xf];
}
return new String(buf);
}
public static final String dumpHex(byte bytes[]) {
int bytepos, bufpos, linecount = (bytes.length + 15) / 16;
char[] buf = new char[linecount * DUMP_HEX_CHAR_COUNT];
byte[] bs = new byte[16];
bytepos = 0;
for (int i = 0; i < linecount; i++) {
int addr = i * 16;
bufpos = i * DUMP_HEX_CHAR_COUNT;
buf[bufpos++] = upcaseHexChar[(addr >> 12) & 0xf];
buf[bufpos++] = upcaseHexChar[(addr >> 8) & 0xf];
buf[bufpos++] = upcaseHexChar[(addr >> 4) & 0xf];
buf[bufpos++] = upcaseHexChar[(addr) & 0xf];
buf[bufpos++] = ' ';
buf[bufpos++] = ' ';
for (int j = 0; j < 16; j++, bytepos++) {
if (bytepos < bytes.length) {
int code = bytes[bytepos] & 0xff;
bs[j] = bytes[bytepos];
buf[bufpos++] = upcaseHexChar[code >> 4];
buf[bufpos++] = upcaseHexChar[code & 0xf];
if (j == 7) buf[bufpos++] = '-';
else buf[bufpos++] = ' ';
} else {
buf[bufpos++] = ' ';
buf[bufpos++] = ' ';
buf[bufpos++] = ' ';
bs[j] = ' ';
}
}
buf[bufpos++] = ' ';
buf[bufpos++] = ' ';
char[] chs = new String(bs).toCharArray();
for (int k = 0; k < chs.length; k++) {
char ch = chs[k];
if ((ch > '\0') && (ch < ' ')) buf[bufpos++] = '.';
else buf[bufpos++] = ch;
}
int endLine = (i + 1) * DUMP_HEX_CHAR_COUNT - 2;
for (; bufpos < endLine; bufpos++)
buf[bufpos] = ' ';
buf[bufpos++] = '\r';
buf[bufpos++] = '\n';
}
return new String(buf);
}
public static final byte[] decodeHex(String hex) {
char chars[] = hex.toCharArray();
byte bytes[] = new byte[chars.length / 2];
int byteCount = 0;
for (int i = 0; i < chars.length; i += 2) {
byte newByte = 0;
newByte |= hexCharCodes[chars[i]];
newByte <<= 4;
newByte |= hexCharCodes[chars[i + 1]];
bytes[byteCount] = newByte;
byteCount++;
}
return bytes;
}
public static String encodeBase64(String data) {
return encodeBase64(data.getBytes());
}
public static String encodeBase64(byte data[]) {
int len = data.length;
StringBuffer ret = new StringBuffer((len / 3 + 1) * 4);
for (int i = 0; i < len; i++) {
int c = data[i] >> 2 & 0x3f;
ret.append(base64Chars[c]);
c = data[i] << 4 & 0x3f;
if (++i < len) c |= data[i] >> 4 & 0xf;
ret.append(base64Chars[c]);
if (i < len) {
c = data[i] << 2 & 0x3f;
if (++i < len) c |= data[i] >> 6 & 3;
ret.append(base64Chars[c]);
} else {
i++;
ret.append('=');
}
if (i < len) {
c = data[i] & 0x3f;
ret.append(base64Chars[c]);
} else {
ret.append('=');
}
}
return ret.toString();
}
public static byte[] decodeBase64(String data) {
int len = data.length();
byte[] result = new byte[((len * 3) / 4)];
int pos = 0;
for (int i = 0; i < len; i++) {
int c = base64Codes[data.charAt(i)];
i++;
int c1 = base64Codes[data.charAt(i)];
c = c << 2 | c1 >> 4 & 3;
result[pos++] = (byte) c;
if (++i < len) {
c = data.charAt(i);
if (61 == c) break;
c = base64Codes[data.charAt(i)];
c1 = c1 << 4 & 0xf0 | c >> 2 & 0xf;
result[pos++] = (byte) c1;
}
if (++i >= len) continue;
c1 = data.charAt(i);
if (61 == c1) break;
c1 = base64Codes[data.charAt(i)];
c = c << 6 & 0xc0 | c1;
result[pos++] = (byte) c;
}
if (result.length != pos) {
byte[] result2 = new byte[pos];
System.arraycopy(result, 0, result2, 0, pos);
result = result2;
}
return result;
}
public static final String[] toLowerCaseWordArray(String text) {
if (text == null || text.length() == 0) return new String[0];
List wordList = new ArrayList();
BreakIterator boundary = BreakIterator.getWordInstance();
boundary.setText(text);
int start = 0;
for (int end = boundary.next(); end != -1; end = boundary.next()) {
String tmp = text.substring(start, end).trim();
tmp = tmp.replace("+", "");
tmp = tmp.replace("/", "");
tmp = tmp.replace("\\", "");
tmp = tmp.replace("#", "");
tmp = tmp.replace("*", "");
tmp = tmp.replace(")", "");
tmp = tmp.replace("(", "");
tmp = tmp.replace("&", "");
if (tmp.length() > 0) wordList.add(tmp);
start = end;
}
return (String[]) (String[]) wordList.toArray(new String[wordList.size()]);
}
public static final String createTempTable() {
return "temp_" + StringUtil.randomString(10);
}
/**
* 产生指定长度的字符串
*
* @param length
* @return
*/
public static final String randomString(int length) {
if (length < 1) {
return null;
}
char randBuffer[] = new char[length];
for (int i = 0; i < randBuffer.length; i++)
randBuffer[i] = numbersAndLetters[randGen.nextInt(numbersAndLetters.length)];
return new String(randBuffer);
}
public static final String randomNumber(int length) {
Long value = Math.abs(randGen.nextLong());
String strValue = value.toString();
if (strValue.length() > length) {
strValue = strValue.substring(0, length);
}
return strValue;
}
public static final String chopAtWord(String string, int length) {
if (string == null) return string;
char charArray[] = string.toCharArray();
int sLength = string.length();
if (length < sLength) sLength = length;
for (int i = 0; i < sLength - 1; i++) {
if (charArray[i] == '\r' && charArray[i + 1] == '\n') return string.substring(0, i + 1);
if (charArray[i] == '\n') return string.substring(0, i);
}
if (charArray[sLength - 1] == '\n') return string.substring(0, sLength - 1);
if (string.length() < length) return string;
for (int i = length - 1; i > 0; i--)
if (charArray[i] == ' ') return string.substring(0, i).trim();
return string.substring(0, length);
}
public static final String escapeForXML(String string) {
if (string == null) return null;
int i = 0;
int last = 0;
char input[] = string.toCharArray();
int len = input.length;
StringBuffer out = new StringBuffer((int) ((double) len * 1.3D));
for (; i < len; i++) {
char ch = input[i];
if (ch > '>') continue;
if (ch == '<') {
if (i > last) out.append(input, last, i - last);
last = i + 1;
out.append(LT_ENCODE);
continue;
}
if (ch == '&') {
if (i > last) out.append(input, last, i - last);
last = i + 1;
out.append(AMP_ENCODE);
continue;
}
if (ch != '"') continue;
if (i > last) out.append(input, last, i - last);
last = i + 1;
out.append(QUOTE_ENCODE);
}
if (last == 0) return string;
if (i > last) out.append(input, last, i - last);
return out.toString();
}
public static final String unescapeFromXML(String string) {
string = string.replace("<", "<");
string = string.replace(">", ">");
string = string.replace(""", "\"");
return string.replace("&", "&");
}
public static final String zeroPadString(String string, int length) {
if (string == null || string.length() > length) {
return string;
} else {
StringBuffer buf = new StringBuffer(length);
buf.append(zeroArray, 0, length - string.length()).append(string);
return buf.toString();
}
}
public static final String zeroAppendString(String string, int length) {
if (string == null || string.length() > length) {
return string;
} else {
StringBuffer buf = new StringBuffer(length);
buf.append(string).append(zeroArray, 0, length - string.length());
return buf.toString();
}
}
public static final String charPadString(String string, int length, char append) {
if (string == null || string.length() > length) {
return string;
} else {
char[] charArray = new char[length - string.length()];
for (int i = 0; i < charArray.length; i++) {
charArray[i] = append;
}
StringBuffer buf = new StringBuffer(length);
buf.append(charArray, 0, charArray.length).append(string);
return buf.toString();
}
}
public static final String charAppendString(String string, int length, char append) {
if (string == null || string.length() > length) {
return string;
} else {
char[] charArray = new char[length - string.length()];
for (int i = 0; i < charArray.length; i++) {
charArray[i] = append;
}
StringBuffer buf = new StringBuffer(length);
buf.append(string).append(charArray, 0, charArray.length);
return buf.toString();
}
}
public static final String dateToMillis(Date date) {
return zeroPadString(Long.toString(date.getTime()), 15);
}
public static final String collectionToString(Collection