⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stringutils.java

📁 mysql5.0 JDBC 驱动 放在glassfish或者tomcat的lib文件夹下就可以了
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* Copyright  2002-2004 MySQL AB, 2008 Sun Microsystems This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as  published by the Free Software Foundation. There are special exceptions to the terms and conditions of the GPL  as it is applied to this software. View the full text of the  exception in file EXCEPTIONS-CONNECTOR-J in the directory of this  software distribution. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */package com.mysql.jdbc;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.StringReader;import java.io.UnsupportedEncodingException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.math.BigDecimal;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.StringTokenizer;/** * Various utility methods for converting to/from byte arrays in the platform * encoding *  * @author Mark Matthews */public class StringUtils {		private static final int BYTE_RANGE = (1 + Byte.MAX_VALUE) - Byte.MIN_VALUE;	private static byte[] allBytes = new byte[BYTE_RANGE];	private static char[] byteToChars = new char[BYTE_RANGE];	private static Method toPlainStringMethod;	static final int WILD_COMPARE_MATCH_NO_WILD = 0;	static final int WILD_COMPARE_MATCH_WITH_WILD = 1;	static final int WILD_COMPARE_NO_MATCH = -1;	static {		for (int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {			allBytes[i - Byte.MIN_VALUE] = (byte) i;		}		String allBytesString = new String(allBytes, 0, Byte.MAX_VALUE				- Byte.MIN_VALUE);		int allBytesStringLen = allBytesString.length();		for (int i = 0; (i < (Byte.MAX_VALUE - Byte.MIN_VALUE))				&& (i < allBytesStringLen); i++) {			byteToChars[i] = allBytesString.charAt(i);		}		try {			toPlainStringMethod = BigDecimal.class.getMethod("toPlainString",					new Class[0]);		} catch (NoSuchMethodException nsme) {			// that's okay, we fallback to .toString()		}	}	/**	 * Takes care of the fact that Sun changed the output of	 * BigDecimal.toString() between JDK-1.4 and JDK 5	 * 	 * @param decimal	 *            the big decimal to stringify	 * 	 * @return a string representation of 'decimal'	 */	public static String consistentToString(BigDecimal decimal) {		if (decimal == null) {			return null;		}		if (toPlainStringMethod != null) {			try {				return (String) toPlainStringMethod.invoke(decimal, null);			} catch (InvocationTargetException invokeEx) {				// that's okay, we fall-through to decimal.toString()			} catch (IllegalAccessException accessEx) {				// that's okay, we fall-through to decimal.toString()			}		}		return decimal.toString();	}	/**	 * Dumps the given bytes to STDOUT as a hex dump (up to length bytes).	 * 	 * @param byteBuffer	 *            the data to print as hex	 * @param length	 *            the number of bytes to print	 * 	 * @return ...	 */	public static final String dumpAsHex(byte[] byteBuffer, int length) {		StringBuffer outputBuf = new StringBuffer(length * 4);		int p = 0;		int rows = length / 8;		for (int i = 0; (i < rows) && (p < length); i++) {			int ptemp = p;			for (int j = 0; j < 8; j++) {				String hexVal = Integer.toHexString(byteBuffer[ptemp] & 0xff);				if (hexVal.length() == 1) {					hexVal = "0" + hexVal; //$NON-NLS-1$				}				outputBuf.append(hexVal + " "); //$NON-NLS-1$				ptemp++;			}			outputBuf.append("    "); //$NON-NLS-1$			for (int j = 0; j < 8; j++) {				int b = 0xff & byteBuffer[p];								if (b > 32 && b < 127) {					outputBuf.append((char) b + " "); //$NON-NLS-1$				} else {					outputBuf.append(". "); //$NON-NLS-1$				}				p++;			}			outputBuf.append("\n"); //$NON-NLS-1$		}		int n = 0;		for (int i = p; i < length; i++) {			String hexVal = Integer.toHexString(byteBuffer[i] & 0xff);			if (hexVal.length() == 1) {				hexVal = "0" + hexVal; //$NON-NLS-1$			}			outputBuf.append(hexVal + " "); //$NON-NLS-1$			n++;		}		for (int i = n; i < 8; i++) {			outputBuf.append("   "); //$NON-NLS-1$		}		outputBuf.append("    "); //$NON-NLS-1$		for (int i = p; i < length; i++) {			int b = 0xff & byteBuffer[i];						if (b > 32 && b < 127) {				outputBuf.append((char) b + " "); //$NON-NLS-1$			} else {				outputBuf.append(". "); //$NON-NLS-1$			}		}		outputBuf.append("\n"); //$NON-NLS-1$		return outputBuf.toString();	}	private static boolean endsWith(byte[] dataFrom, String suffix) {		for (int i = 1; i <= suffix.length(); i++) {			int dfOffset = dataFrom.length - i;			int suffixOffset = suffix.length() - i;			if (dataFrom[dfOffset] != suffix.charAt(suffixOffset)) {				return false;			}		}		return true;	}	/**	 * Unfortunately, SJIS has 0x5c as a high byte in some of its double-byte	 * characters, so we need to escape it.	 * 	 * @param origBytes	 *            the original bytes in SJIS format	 * @param origString	 *            the string that had .getBytes() called on it	 * @param offset	 *            where to start converting from	 * @param length	 *            how many characters to convert.	 * 	 * @return byte[] with 0x5c escaped	 */	public static byte[] escapeEasternUnicodeByteStream(byte[] origBytes,			String origString, int offset, int length) {		if ((origBytes == null) || (origBytes.length == 0)) {			return origBytes;		}		int bytesLen = origBytes.length;		int bufIndex = 0;		int strIndex = 0;		ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(bytesLen);		while (true) {			if (origString.charAt(strIndex) == '\\') {				// write it out as-is				bytesOut.write(origBytes[bufIndex++]);				// bytesOut.write(origBytes[bufIndex++]);			} else {				// Grab the first byte				int loByte = origBytes[bufIndex];				if (loByte < 0) {					loByte += 256; // adjust for signedness/wrap-around				}				// We always write the first byte				bytesOut.write(loByte);				//				// The codepage characters in question exist between				// 0x81-0x9F and 0xE0-0xFC...				//				// See:				//				// http://www.microsoft.com/GLOBALDEV/Reference/dbcs/932.htm				//				// Problematic characters in GBK				//				// U+905C : CJK UNIFIED IDEOGRAPH				//				// Problematic characters in Big5				//				// B9F0 = U+5C62 : CJK UNIFIED IDEOGRAPH				//				if (loByte >= 0x80) {					if (bufIndex < (bytesLen - 1)) {						int hiByte = origBytes[bufIndex + 1];						if (hiByte < 0) {							hiByte += 256; // adjust for signedness/wrap-around						}						// write the high byte here, and increment the index						// for the high byte						bytesOut.write(hiByte);						bufIndex++;						// escape 0x5c if necessary						if (hiByte == 0x5C) {							bytesOut.write(hiByte);						}					}				} else if (loByte == 0x5c) {					if (bufIndex < (bytesLen - 1)) {						int hiByte = origBytes[bufIndex + 1];						if (hiByte < 0) {							hiByte += 256; // adjust for signedness/wrap-around						}						if (hiByte == 0x62) {							// we need to escape the 0x5c							bytesOut.write(0x5c);							bytesOut.write(0x62);							bufIndex++;						}					}				}				bufIndex++;			}			if (bufIndex >= bytesLen) {				// we're done				break;			}			strIndex++;		}		return bytesOut.toByteArray();	}	/**	 * Returns the first non whitespace char, converted to upper case	 * 	 * @param searchIn	 *            the string to search in	 * 	 * @return the first non-whitespace character, upper cased.	 */	public static char firstNonWsCharUc(String searchIn) {		return firstNonWsCharUc(searchIn, 0);	}		public static char firstNonWsCharUc(String searchIn, int startAt) {		if (searchIn == null) {			return 0;		}		int length = searchIn.length();		for (int i = startAt; i < length; i++) {			char c = searchIn.charAt(i);			if (!Character.isWhitespace(c)) {				return Character.toUpperCase(c);			}		}		return 0;	}	public static char firstAlphaCharUc(String searchIn, int startAt) {		if (searchIn == null) {			return 0;		}		int length = searchIn.length();		for (int i = startAt; i < length; i++) {			char c = searchIn.charAt(i);			if (Character.isLetter(c)) {				return Character.toUpperCase(c);			}		}		return 0;	}		/**	 * Adds '+' to decimal numbers that are positive (MySQL doesn't understand	 * them otherwise	 * 	 * @param dString	 *            The value as a string	 * 	 * @return String the string with a '+' added (if needed)	 */	public static final String fixDecimalExponent(String dString) {		int ePos = dString.indexOf("E"); //$NON-NLS-1$		if (ePos == -1) {			ePos = dString.indexOf("e"); //$NON-NLS-1$		}		if (ePos != -1) {			if (dString.length() > (ePos + 1)) {				char maybeMinusChar = dString.charAt(ePos + 1);				if (maybeMinusChar != '-' && maybeMinusChar != '+') {					StringBuffer buf = new StringBuffer(dString.length() + 1);					buf.append(dString.substring(0, ePos + 1));					buf.append('+');					buf.append(dString.substring(ePos + 1, dString.length()));					dString = buf.toString();				}			}		}		return dString;	}	public static final byte[] getBytes(char[] c,			SingleByteCharsetConverter converter, String encoding,			String serverEncoding, boolean parserKnowsUnicode)			throws SQLException {		try {			byte[] b = null;			if (converter != null) {				b = converter.toBytes(c);			} else if (encoding == null) {				b = new String(c).getBytes();			} else {				String s = new String(c);				b = s.getBytes(encoding);				if (!parserKnowsUnicode && (encoding.equalsIgnoreCase("SJIS") //$NON-NLS-1$						|| encoding.equalsIgnoreCase("BIG5") //$NON-NLS-1$				|| encoding.equalsIgnoreCase("GBK"))) { //$NON-NLS-1$					if (!encoding.equalsIgnoreCase(serverEncoding)) {						b = escapeEasternUnicodeByteStream(b, s, 0, s.length());					}				}			}			return b;		} catch (UnsupportedEncodingException uee) {			throw SQLError.createSQLException(Messages.getString("StringUtils.5") //$NON-NLS-1$					+ encoding + Messages.getString("StringUtils.6"),					SQLError.SQL_STATE_ILLEGAL_ARGUMENT); //$NON-NLS-1$		}	}	public static final byte[] getBytes(char[] c,			SingleByteCharsetConverter converter, String encoding,			String serverEncoding, int offset, int length,			boolean parserKnowsUnicode) throws SQLException {		try {			byte[] b = null;			if (converter != null) {				b = converter.toBytes(c, offset, length);			} else if (encoding == null) {				byte[] temp = new String(c, offset, length).getBytes();				length = temp.length;								b = new byte[length];				System.arraycopy(temp, 0, b, 0, length);			} else {				String s = new String(c, offset, length);				byte[] temp = s.getBytes(encoding);				length = temp.length;								b = new byte[length];				System.arraycopy(temp, 0, b, 0, length);				if (!parserKnowsUnicode && (encoding.equalsIgnoreCase("SJIS") //$NON-NLS-1$						|| encoding.equalsIgnoreCase("BIG5") //$NON-NLS-1$				|| encoding.equalsIgnoreCase("GBK"))) { //$NON-NLS-1$					if (!encoding.equalsIgnoreCase(serverEncoding)) {						b = escapeEasternUnicodeByteStream(b, s, offset, length);					}				}			}			return b;		} catch (UnsupportedEncodingException uee) {			throw SQLError.createSQLException(Messages.getString("StringUtils.10") //$NON-NLS-1$					+ encoding + Messages.getString("StringUtils.11"),					SQLError.SQL_STATE_ILLEGAL_ARGUMENT); //$NON-NLS-1$		}	}	public static final byte[] getBytes(char[] c, String encoding,			String serverEncoding, boolean parserKnowsUnicode, 			ConnectionImpl conn)			throws SQLException {		try {						SingleByteCharsetConverter converter = null;						if (conn != null) {				converter = conn.getCharsetConverter(encoding);			} else {				converter = SingleByteCharsetConverter.getInstance(encoding, null);			}			return getBytes(c, converter, encoding, serverEncoding,					parserKnowsUnicode);		} catch (UnsupportedEncodingException uee) {			throw SQLError.createSQLException(Messages.getString("StringUtils.0") //$NON-NLS-1$					+ encoding + Messages.getString("StringUtils.1"),					SQLError.SQL_STATE_ILLEGAL_ARGUMENT); //$NON-NLS-1$		}	}	/**	 * Returns the byte[] representation of the given string (re)using the given	 * charset converter, and the given encoding.	 * 	 * @param s	 *            the string to convert	 * @param converter	 *            the converter to reuse	 * @param encoding	 *            the character encoding to use	 * @param serverEncoding	 *            DOCUMENT ME!	 * @param parserKnowsUnicode	 *            DOCUMENT ME!	 * 	 * @return byte[] representation of the string	 * 	 * @throws SQLException	 *             if an encoding unsupported by the JVM is supplied.	 */	public static final byte[] getBytes(String s,			SingleByteCharsetConverter converter, String encoding,			String serverEncoding, boolean parserKnowsUnicode)			throws SQLException {		try {			byte[] b = null;			if (converter != null) {				b = converter.toBytes(s);			} else if (encoding == null) {				b = s.getBytes();			} else {				b = s.getBytes(encoding);				if (!parserKnowsUnicode && (encoding.equalsIgnoreCase("SJIS") //$NON-NLS-1$						|| encoding.equalsIgnoreCase("BIG5") //$NON-NLS-1$				|| encoding.equalsIgnoreCase("GBK"))) { //$NON-NLS-1$					if (!encoding.equalsIgnoreCase(serverEncoding)) {						b = escapeEasternUnicodeByteStream(b, s, 0, s.length());					}				}			}			return b;		} catch (UnsupportedEncodingException uee) {			throw SQLError.createSQLException(Messages.getString("StringUtils.5") //$NON-NLS-1$					+ encoding + Messages.getString("StringUtils.6"),					SQLError.SQL_STATE_ILLEGAL_ARGUMENT); //$NON-NLS-1$		}	}	public static final byte[] getBytesWrapped(String s, char beginWrap, char endWrap,			SingleByteCharsetConverter converter, String encoding,			String serverEncoding, boolean parserKnowsUnicode)			throws SQLException {		try {			byte[] b = null;			if (converter != null) {				b = converter.toBytesWrapped(s, beginWrap, endWrap);			} else if (encoding == null) {				StringBuffer buf = new StringBuffer(s.length() + 2);				buf.append(beginWrap);				buf.append(s);				buf.append(endWrap);								b = buf.toString().getBytes();			} else {				StringBuffer buf = new StringBuffer(s.length() + 2);				buf.append(beginWrap);				buf.append(s);				buf.append(endWrap);								b = buf.toString().getBytes(encoding);				if (!parserKnowsUnicode && (encoding.equalsIgnoreCase("SJIS") //$NON-NLS-1$

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -