StringEscapeUtils
用escapeJava方法转义
用unescapeJava方法反转义
用escapeHtml方法转义
用unescapeHtml方法反转义
用escapeXml方法转义
用unescapeXml方法反转义
用escapeJavaScript方法转义
用unescapeJavaScript方法反转义
源码内容方法
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.commons.lang3;import java.io.IOException;import java.io.Writer;import org.apache.commons.lang3.text.translate.AggregateTranslator;import org.apache.commons.lang3.text.translate.CharSequenceTranslator;import org.apache.commons.lang3.text.translate.EntityArrays;import org.apache.commons.lang3.text.translate.LookupTranslator;import org.apache.commons.lang3.text.translate.NumericEntityUnescaper;import org.apache.commons.lang3.text.translate.OctalUnescaper;import org.apache.commons.lang3.text.translate.UnicodeEscaper;import org.apache.commons.lang3.text.translate.UnicodeUnescaper;/** * <p>Escapes and unescapes {@code String}s for * Java, Java Script, HTML and XML.</p> * * <p>#ThreadSafe#</p> * @since 2.0 * @version $Id: StringEscapeUtils.java 1148520 2011-07-19 20:53:23Z ggregory $ */public class StringEscapeUtils { /* ESCAPE TRANSLATORS */ public static final CharSequenceTranslator ESCAPE_JAVA = new LookupTranslator( new String[][] { {"\"", "\\\""}, {"\\", "\\\\"}, }).with( new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE()) ).with( UnicodeEscaper.outsideOf(32, 0x7f) ); public static final CharSequenceTranslator ESCAPE_ECMASCRIPT = new AggregateTranslator( new LookupTranslator( new String[][] { {"'", "\\'"}, {"\"", "\\\""}, {"\\", "\\\\"}, {"/", "\\/"} }), new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE()), UnicodeEscaper.outsideOf(32, 0x7f) ); public static final CharSequenceTranslator ESCAPE_XML = new AggregateTranslator( new LookupTranslator(EntityArrays.BASIC_ESCAPE()), new LookupTranslator(EntityArrays.APOS_ESCAPE()) ); public static final CharSequenceTranslator ESCAPE_HTML3 = new AggregateTranslator( new LookupTranslator(EntityArrays.BASIC_ESCAPE()), new LookupTranslator(EntityArrays.ISO8859_1_ESCAPE()) ); public static final CharSequenceTranslator ESCAPE_HTML4 = new AggregateTranslator( new LookupTranslator(EntityArrays.BASIC_ESCAPE()), new LookupTranslator(EntityArrays.ISO8859_1_ESCAPE()), new LookupTranslator(EntityArrays.HTML40_EXTENDED_ESCAPE()) ); public static final CharSequenceTranslator ESCAPE_CSV = new CsvEscaper(); // TODO: Create a parent class - 'SinglePassTranslator' ? // It would handle the index checking + length returning, // and could also have an optimization check method. static class CsvEscaper extends CharSequenceTranslator { private static final char CSV_DELIMITER = ','; private static final char CSV_QUOTE = '"'; private static final String CSV_QUOTE_STR = String.valueOf(CSV_QUOTE); private static final char[] CSV_SEARCH_CHARS = new char[] {CSV_DELIMITER, CSV_QUOTE, CharUtils.CR, CharUtils.LF}; @Override public int translate(CharSequence input, int index, Writer out) throws IOException { if(index != 0) { throw new IllegalStateException("CsvEscaper should never reach the [1] index"); } if (StringUtils.containsNone(input.toString(), CSV_SEARCH_CHARS)) { out.write(input.toString()); } else { out.write(CSV_QUOTE); out.write(StringUtils.replace(input.toString(), CSV_QUOTE_STR, CSV_QUOTE_STR + CSV_QUOTE_STR)); out.write(CSV_QUOTE); } return input.length(); } } /* UNESCAPE TRANSLATORS */ // TODO: throw "illegal character: \92" as an Exception if a \ on the end of the Java (as per the compiler)? public static final CharSequenceTranslator UNESCAPE_JAVA = new AggregateTranslator( new OctalUnescaper(), // .between('\1', '\377'), new UnicodeUnescaper(), new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_UNESCAPE()), new LookupTranslator( new String[][] { {"\\\\", "\\"}, {"\\\"", "\""}, {"\\'", "'"}, {"\\", ""} }) ); public static final CharSequenceTranslator UNESCAPE_ECMASCRIPT = UNESCAPE_JAVA; public static final CharSequenceTranslator UNESCAPE_HTML3 = new AggregateTranslator( new LookupTranslator(EntityArrays.BASIC_UNESCAPE()), new LookupTranslator(EntityArrays.ISO8859_1_UNESCAPE()), new NumericEntityUnescaper() ); public static final CharSequenceTranslator UNESCAPE_HTML4 = new AggregateTranslator( new LookupTranslator(EntityArrays.BASIC_UNESCAPE()), new LookupTranslator(EntityArrays.ISO8859_1_UNESCAPE()), new LookupTranslator(EntityArrays.HTML40_EXTENDED_UNESCAPE()), new NumericEntityUnescaper() ); public static final CharSequenceTranslator UNESCAPE_XML = new AggregateTranslator( new LookupTranslator(EntityArrays.BASIC_UNESCAPE()), new LookupTranslator(EntityArrays.APOS_UNESCAPE()), new NumericEntityUnescaper() ); public static final CharSequenceTranslator UNESCAPE_CSV = new CsvUnescaper(); static class CsvUnescaper extends CharSequenceTranslator { private static final char CSV_DELIMITER = ','; private static final char CSV_QUOTE = '"'; private static final String CSV_QUOTE_STR = String.valueOf(CSV_QUOTE); private static final char[] CSV_SEARCH_CHARS = new char[] {CSV_DELIMITER, CSV_QUOTE, CharUtils.CR, CharUtils.LF}; @Override public int translate(CharSequence input, int index, Writer out) throws IOException { if(index != 0) { throw new IllegalStateException("CsvUnescaper should never reach the [1] index"); } if ( input.charAt(0) != CSV_QUOTE || input.charAt(input.length() - 1) != CSV_QUOTE ) { out.write(input.toString()); return input.length(); } // strip quotes String quoteless = input.subSequence(1, input.length() - 1).toString(); if ( StringUtils.containsAny(quoteless, CSV_SEARCH_CHARS) ) { // deal with escaped quotes; ie) "" out.write(StringUtils.replace(quoteless, CSV_QUOTE_STR + CSV_QUOTE_STR, CSV_QUOTE_STR)); } else { out.write(input.toString()); } return input.length(); } } public StringEscapeUtils() { super(); } public static final String escapeJava(String input) { return ESCAPE_JAVA.translate(input); } public static final String escapeEcmaScript(String input) { return ESCAPE_ECMASCRIPT.translate(input); } public static final String unescapeJava(String input) { return UNESCAPE_JAVA.translate(input); } public static final String unescapeEcmaScript(String input) { return UNESCAPE_ECMASCRIPT.translate(input); } public static final String escapeHtml4(String input) { return ESCAPE_HTML4.translate(input); } public static final String escapeHtml3(String input) { return ESCAPE_HTML3.translate(input); } public static final String unescapeHtml4(String input) { return UNESCAPE_HTML4.translate(input); } public static final String unescapeHtml3(String input) { return UNESCAPE_HTML3.translate(input); } public static final String escapeXml(String input) { return ESCAPE_XML.translate(input); } public static final String unescapeXml(String input) { return UNESCAPE_XML.translate(input); } //----------------------------------------------------------------------- public static final String escapeCsv(String input) { return ESCAPE_CSV.translate(input); } public static final String unescapeCsv(String input) { return UNESCAPE_CSV.translate(input); }}
针对转译,尽量不要进行转译后入库,只做查询出特殊字符的转译,或者自己写具体字符的转译,防止转译编码等导致字符混乱