📄 stringutil.java
字号:
if (!(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'
|| c >= '0' && c <= '9'
|| c == '_' || c == '-' || c == '.' || c == '!' || c == '~'
|| c >= '\'' && c <= '*')) {
break;
}
}
if (i == ln) {
// Nothing to escape
return s;
}
StringBuffer b = new StringBuffer(ln + ln / 3 + 2);
b.append(s.substring(0, i));
int encstart = i;
for (i++; i < ln; i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'
|| c >= '0' && c <= '9'
|| c == '_' || c == '-' || c == '.' || c == '!' || c == '~'
|| c >= '\'' && c <= '*') {
if (encstart != -1) {
byte[] o = s.substring(encstart, i).getBytes(charset);
for (int j = 0; j < o.length; j++) {
b.append('%');
byte bc = o[j];
int c1 = bc & 0x0F;
int c2 = (bc >> 4) & 0x0F;
b.append((char) (c2 < 10 ? c2 + '0' : c2 - 10 + 'A'));
b.append((char) (c1 < 10 ? c1 + '0' : c1 - 10 + 'A'));
}
encstart = -1;
}
b.append(c);
} else {
if (encstart == -1) {
encstart = i;
}
}
}
if (encstart != -1) {
byte[] o = s.substring(encstart, i).getBytes(charset);
for (int j = 0; j < o.length; j++) {
b.append('%');
byte bc = o[j];
int c1 = bc & 0x0F;
int c2 = (bc >> 4) & 0x0F;
b.append((char) (c2 < 10 ? c2 + '0' : c2 - 10 + 'A'));
b.append((char) (c1 < 10 ? c1 + '0' : c1 - 10 + 'A'));
}
}
return b.toString();
}
private static char[] createEscapes()
{
char[] escapes = new char['\\' + 1];
for(int i = 0; i < 32; ++i)
{
escapes[i] = 1;
}
escapes['\\'] = '\\';
escapes['\''] = '\'';
escapes['"'] = '"';
escapes['<'] = 'l';
escapes['>'] = 'g';
escapes['&'] = 'a';
escapes['\b'] = 'b';
escapes['\t'] = 't';
escapes['\n'] = 'n';
escapes['\f'] = 'f';
escapes['\r'] = 'r';
escapes['$'] = '$';
return escapes;
}
public static String FTLStringLiteralEnc(String s)
{
StringBuffer buf = null;
int l = s.length();
int el = ESCAPES.length;
for(int i = 0; i < l; i++)
{
char c = s.charAt(i);
if(c < el)
{
char escape = ESCAPES[c];
switch(escape)
{
case 0:
{
if (buf != null) {
buf.append(c);
}
break;
}
case 1:
{
if (buf == null) {
buf = new StringBuffer(s.length() + 3);
buf.append(s.substring(0, i));
}
// hex encoding for characters below 0x20
// that have no other escape representation
buf.append("\\x00");
int c2 = (c >> 4) & 0x0F;
c = (char) (c & 0x0F);
buf.append((char) (c2 < 10 ? c2 + '0' : c2 - 10 + 'A'));
buf.append((char) (c < 10 ? c + '0' : c - 10 + 'A'));
break;
}
default:
{
if (buf == null) {
buf = new StringBuffer(s.length() + 2);
buf.append(s.substring(0, i));
}
buf.append('\\');
buf.append(escape);
}
}
} else {
if (buf != null) {
buf.append(c);
}
}
}
return buf == null ? s : buf.toString();
}
/**
* FTL string literal decoding.
*
* \\, \", \', \n, \t, \r, \b and \f will be replaced according to
* Java rules. In additional, it knows \g, \l, \a and \{ which are
* replaced with <, >, & and { respectively.
* \x works as hexadecimal character code escape. The character
* codes are interpreted according to UCS basic plane (Unicode).
* "f\x006Fo", "f\x06Fo" and "f\x6Fo" will be "foo".
* "f\x006F123" will be "foo123" as the maximum number of digits is 4.
*
* All other \X (where X is any character not mentioned above or End-of-string)
* will cause a ParseException.
*
* @param s String literal <em>without</em> the surrounding quotation marks
* @return String with all escape sequences resolved
* @throws ParseException if there string contains illegal escapes
*/
public static String FTLStringLiteralDec(String s) throws ParseException {
int idx = s.indexOf('\\');
if (idx == -1) {
return s;
}
int lidx = s.length() - 1;
int bidx = 0;
StringBuffer buf = new StringBuffer(lidx);
do {
buf.append(s.substring(bidx, idx));
if (idx >= lidx) {
throw new ParseException("The last character of string literal is backslash", 0,0);
}
char c = s.charAt(idx + 1);
switch (c) {
case '"':
buf.append('"');
bidx = idx + 2;
break;
case '\'':
buf.append('\'');
bidx = idx + 2;
break;
case '\\':
buf.append('\\');
bidx = idx + 2;
break;
case 'n':
buf.append('\n');
bidx = idx + 2;
break;
case 'r':
buf.append('\r');
bidx = idx + 2;
break;
case 't':
buf.append('\t');
bidx = idx + 2;
break;
case 'f':
buf.append('\f');
bidx = idx + 2;
break;
case 'b':
buf.append('\b');
bidx = idx + 2;
break;
case 'g':
buf.append('>');
bidx = idx + 2;
break;
case 'l':
buf.append('<');
bidx = idx + 2;
break;
case 'a':
buf.append('&');
bidx = idx + 2;
break;
case '{':
buf.append('{');
bidx = idx + 2;
break;
case 'x': {
idx += 2;
int x = idx;
int y = 0;
int z = lidx > idx + 3 ? idx + 3 : lidx;
while (idx <= z) {
char b = s.charAt(idx);
if (b >= '0' && b <= '9') {
y <<= 4;
y += b - '0';
} else if (b >= 'a' && b <= 'f') {
y <<= 4;
y += b - 'a' + 10;
} else if (b >= 'A' && b <= 'F') {
y <<= 4;
y += b - 'A' + 10;
} else {
break;
}
idx++;
}
if (x < idx) {
buf.append((char) y);
} else {
throw new ParseException("Invalid \\x escape in a string literal",0,0);
}
bidx = idx;
break;
}
default:
throw new ParseException("Invalid escape sequence (\\" + c + ") in a string literal",0,0);
}
idx = s.indexOf('\\', bidx);
} while (idx != -1);
buf.append(s.substring(bidx));
return buf.toString();
}
public static Locale deduceLocale(String input) {
Locale locale = Locale.getDefault();
if (input.charAt(0) == '"') input = input.substring(1, input.length() -1);
StringTokenizer st = new StringTokenizer(input, ",_ ");
String lang = "", country = "";
if (st.hasMoreTokens()) {
lang = st.nextToken();
}
if (st.hasMoreTokens()) {
country = st.nextToken();
}
if (!st.hasMoreTokens()) {
locale = new Locale(lang, country);
}
else {
locale = new Locale(lang, country, st.nextToken());
}
return locale;
}
public static String capitalize(String s) {
StringTokenizer st = new StringTokenizer(s, " \t\r\n", true);
StringBuffer buf = new StringBuffer(s.length());
while (st.hasMoreTokens()) {
String tok = st.nextToken();
buf.append(tok.substring(0, 1).toUpperCase());
buf.append(tok.substring(1).toLowerCase());
}
return buf.toString();
}
public static boolean getYesNo(String s) {
if (s.startsWith("\"")) {
s = s.substring(1, s.length() -1);
}
if (s.equalsIgnoreCase("n")
|| s.equalsIgnoreCase("no")
|| s.equalsIgnoreCase("f")
|| s.equalsIgnoreCase("false")) {
return false;
}
else if (s.equalsIgnoreCase("y")
|| s.equalsIgnoreCase("yes")
|| s.equalsIgnoreCase("t")
|| s.equalsIgnoreCase("true")) {
return true;
}
throw new IllegalArgumentException("Illegal boolean value: " + s);
}
/**
* Splits a string at the specified character.
*/
public static String[] split(String s, char c) {
int i, b, e;
int cnt;
String res[];
int ln = s.length();
i = 0;
cnt = 1;
while ((i = s.indexOf(c, i)) != -1) {
cnt++;
i++;
}
res = new String[cnt];
i = 0;
b = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -