📄 stringutil.java
字号:
/*
* Copyright (c) 2003 The Visigoth Software Society. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowledgement:
* "This product includes software developed by the
* Visigoth Software Society (http://www.visigoths.org/)."
* Alternately, this acknowledgement may appear in the software itself,
* if and wherever such third-party acknowledgements normally appear.
*
* 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the
* project contributors may be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact visigoths@visigoths.org.
*
* 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
* nor may "FreeMarker" or "Visigoth" appear in their names
* without prior written permission of the Visigoth Software Society.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Visigoth Software Society. For more
* information on the Visigoth Software Society, please see
* http://www.visigoths.org/
*/
package freemarker.template.utility;
import java.io.UnsupportedEncodingException;
import java.util.*;
import freemarker.template.Template;
import freemarker.core.ParseException;
import freemarker.core.Environment;
/**
* Some text related utilities.
*
* @version $Id: StringUtil.java,v 1.48 2005/06/01 22:39:08 ddekany Exp $
*/
public class StringUtil {
private static final char[] ESCAPES = createEscapes();
/*
* For better performance most methods are folded down. Don't you scream... :)
*/
/**
* HTML encoding (does not convert line breaks).
* Replaces all '>' '<' '&' and '"' with entity reference
*/
public static String HTMLEnc(String s) {
int ln = s.length();
for (int i = 0; i < ln; i++) {
char c = s.charAt(i);
if (c == '<' || c == '>' || c == '&' || c == '"') {
StringBuffer b =
new StringBuffer(s.substring(0, i));
switch (c) {
case '<': b.append("<"); break;
case '>': b.append(">"); break;
case '&': b.append("&"); break;
case '"': b.append("""); break;
}
i++;
int next = i;
while (i < ln) {
c = s.charAt(i);
if (c == '<' || c == '>' || c == '&' || c == '"') {
b.append(s.substring(next, i));
switch (c) {
case '<': b.append("<"); break;
case '>': b.append(">"); break;
case '&': b.append("&"); break;
case '"': b.append("""); break;
}
next = i + 1;
}
i++;
}
if (next < ln) b.append(s.substring(next));
s = b.toString();
break;
} // if c ==
} // for
return s;
}
/**
* XML Encoding.
* Replaces all '>' '<' '&', "'" and '"' with entity reference
*/
public static String XMLEnc(String s) {
int ln = s.length();
for (int i = 0; i < ln; i++) {
char c = s.charAt(i);
if (c == '<' || c == '>' || c == '&' || c == '"' || c == '\'') {
StringBuffer b =
new StringBuffer(s.substring(0, i));
switch (c) {
case '<': b.append("<"); break;
case '>': b.append(">"); break;
case '&': b.append("&"); break;
case '"': b.append("""); break;
case '\'': b.append("'"); break;
}
i++;
int next = i;
while (i < ln) {
c = s.charAt(i);
if (c == '<' || c == '>' || c == '&' || c == '"' || c == '\'') {
b.append(s.substring(next, i));
switch (c) {
case '<': b.append("<"); break;
case '>': b.append(">"); break;
case '&': b.append("&"); break;
case '"': b.append("""); break;
case '\'': b.append("'"); break;
}
next = i + 1;
}
i++;
}
if (next < ln) b.append(s.substring(next));
s = b.toString();
break;
} // if c ==
} // for
return s;
}
/**
* XML encoding without replacing apostrophes.
* @see #XMLEnc(String)
*/
public static String XMLEncNA(String s) {
int ln = s.length();
for (int i = 0; i < ln; i++) {
char c = s.charAt(i);
if (c == '<' || c == '>' || c == '&' || c == '"') {
StringBuffer b =
new StringBuffer(s.substring(0, i));
switch (c) {
case '<': b.append("<"); break;
case '>': b.append(">"); break;
case '&': b.append("&"); break;
case '"': b.append("""); break;
}
i++;
int next = i;
while (i < ln) {
c = s.charAt(i);
if (c == '<' || c == '>' || c == '&' || c == '"') {
b.append(s.substring(next, i));
switch (c) {
case '<': b.append("<"); break;
case '>': b.append(">"); break;
case '&': b.append("&"); break;
case '"': b.append("""); break;
}
next = i + 1;
}
i++;
}
if (next < ln) b.append(s.substring(next));
s = b.toString();
break;
} // if c ==
} // for
return s;
}
/**
* XML encoding for attributes valies quoted with <tt>"</tt> (not with <tt>'</tt>!).
* Also can be used for HTML attributes that are quoted with <tt>"</tt>.
* @see #XMLEnc(String)
*/
public static String XMLEncQAttr(String s) {
int ln = s.length();
for (int i = 0; i < ln; i++) {
char c = s.charAt(i);
if (c == '<' || c == '&' || c == '"') {
StringBuffer b =
new StringBuffer(s.substring(0, i));
switch (c) {
case '<': b.append("<"); break;
case '&': b.append("&"); break;
case '"': b.append("""); break;
}
i++;
int next = i;
while (i < ln) {
c = s.charAt(i);
if (c == '<' || c == '&' || c == '"') {
b.append(s.substring(next, i));
switch (c) {
case '<': b.append("<"); break;
case '&': b.append("&"); break;
case '"': b.append("""); break;
}
next = i + 1;
}
i++;
}
if (next < ln) {
b.append(s.substring(next));
}
s = b.toString();
break;
} // if c ==
} // for
return s;
}
/**
* XML encoding without replacing apostrophes and quotation marks and greater-than signs.
* @see #XMLEnc(String)
*/
public static String XMLEncNQG(String s) {
int ln = s.length();
for (int i = 0; i < ln; i++) {
char c = s.charAt(i);
if (c == '<' || c == '&') {
StringBuffer b =
new StringBuffer(s.substring(0, i));
switch (c) {
case '<': b.append("<"); break;
case '&': b.append("&"); break;
}
i++;
int next = i;
while (i < ln) {
c = s.charAt(i);
if (c == '<' || c == '&') {
b.append(s.substring(next, i));
switch (c) {
case '<': b.append("<"); break;
case '&': b.append("&"); break;
}
next = i + 1;
}
i++;
}
if (next < ln) b.append(s.substring(next));
s = b.toString();
break;
} // if c ==
} // for
return s;
}
/**
* Rich Text Format encoding (does not replace line breaks).
* Escapes all '\' '{' '}' and '"'
*/
public static String RTFEnc(String s) {
int ln = s.length();
for (int i = 0; i < ln; i++) {
char c = s.charAt(i);
if (c == '\\' || c == '{' || c == '}') {
StringBuffer b =
new StringBuffer(s.substring(0, i));
switch (c) {
case '\\': b.append("\\\\"); break;
case '{': b.append("\\{"); break;
case '}': b.append("\\}"); break;
}
i++;
int next = i;
while (i < ln) {
c = s.charAt(i);
if (c == '\\' || c == '{' || c == '}') {
b.append(s.substring(next, i));
switch (c) {
case '\\': b.append("\\\\"); break;
case '{': b.append("\\{"); break;
case '}': b.append("\\}"); break;
}
next = i + 1;
}
i++;
}
if (next < ln) b.append(s.substring(next));
s = b.toString();
break;
} // if c ==
} // for
return s;
}
/**
* URL encoding (like%20this).
*/
public static String URLEnc(String s, String charset)
throws UnsupportedEncodingException {
int ln = s.length();
int i;
for (i = 0; i < ln; i++) {
char c = s.charAt(i);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -