📄 stringutils.java
字号:
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 = (int) 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 >= 0x81) && (loByte <= 0x9F))
|| ((loByte >= 0xE0) && (loByte <= 0xFC))) {
if (bufIndex < (bytesLen - 1)) {
int hiByte = (int) 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 = (int) 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) {
if (searchIn == null) {
return 0;
}
int length = searchIn.length();
for (int i = 0; i < length; i++) {
char c = searchIn.charAt(i);
if (!Character.isWhitespace(c)) {
return Character.toUpperCase(c);
}
}
return 0;
}
/**
* DOCUMENT ME!
*
* @param searchIn DOCUMENT ME!
* @param searchFor DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static int indexOfIgnoreCase(String searchIn, String searchFor) {
if ((searchIn == null) || (searchFor == null)) {
return -1;
}
int patternLength = searchFor.length();
int stringLength = searchIn.length();
int i = 0;
if (patternLength == 0) {
return -1;
}
// Brute force string pattern matching
char firstCharOfPattern = Character.toUpperCase(searchFor.charAt(0));
lookForFirstChar:
while (true) {
while ((i <= stringLength)
&& (Character.toUpperCase(searchIn.charAt(i)) != firstCharOfPattern)) {
i++;
}
if (i > stringLength) {
return -1;
}
int j = i + 1;
int end = (j + patternLength) - 1;
int k = 1; // start at second char of pattern
while (j < end) {
if (Character.toUpperCase(searchIn.charAt(j++)) != Character
.toUpperCase(searchFor.charAt(k++))) {
i++;
// start over
continue lookForFirstChar;
}
}
return i; // found entire pattern
}
}
/**
* Splits stringToSplit into a list, using the given delimitter
*
* @param stringToSplit the string to split
* @param delimitter the string to split on
* @param trim should the split strings be whitespace trimmed?
*
* @return the list of strings, split by delimitter
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public static final List split(String stringToSplit, String delimitter,
boolean trim) {
if (stringToSplit == null) {
return new ArrayList();
}
if (delimitter == null) {
throw new IllegalArgumentException();
}
StringTokenizer tokenizer = new StringTokenizer(stringToSplit,
delimitter, false);
List splitTokens = new ArrayList(tokenizer.countTokens());
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if (trim) {
token = token.trim();
}
splitTokens.add(token);
}
return splitTokens;
}
/**
* Determines whether or not the string 'searchIn' contains the string
* 'searchFor', dis-regarding case. Shorthand for a
* String.regionMatch(...)
*
* @param searchIn the string to search in
* @param searchFor the string to search for
*
* @return whether searchIn starts with searchFor, ignoring case
*/
public static boolean startsWithIgnoreCase(String searchIn, String searchFor) {
return startsWithIgnoreCase(searchIn, 0, searchFor);
}
/**
* Determines whether or not the string 'searchIn' contains the string
* 'searchFor', dis-regarding case starting at 'startAt' Shorthand for a
* String.regionMatch(...)
*
* @param searchIn the string to search in
* @param startAt the position to start at
* @param searchFor the string to search for
*
* @return whether searchIn starts with searchFor, ignoring case
*/
public static boolean startsWithIgnoreCase(String searchIn, int startAt,
String searchFor) {
return searchIn.regionMatches(true, 0, searchFor, startAt,
searchFor.length());
}
/**
* Determines whether or not the sting 'searchIn' contains the string
* 'searchFor', di-regarding case and leading whitespace
*
* @param searchIn the string to search in
* @param searchFor the string to search for
*
* @return true if the string starts with 'searchFor' ignoring whitespace
*/
public static boolean startsWithIgnoreCaseAndWs(String searchIn,
String searchFor) {
int beginPos = 0;
int inLength = searchIn.length();
for (beginPos = 0; beginPos < inLength; beginPos++) {
if (!Character.isWhitespace(searchIn.charAt(beginPos))) {
break;
}
}
return startsWithIgnoreCase(searchIn, beginPos, searchFor);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -