package com.wgcloud.util; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; /** * @version v2.3 * @ClassName:CodeUtil.java * @author: http://www.wgstart.com * @date: 2019年11月16日 * @Description: 编码转换 * @Copyright: 2017-2022 wgcloud. All rights reserved. */ public class CodeUtil { /** * 把SRC编码成uncode * 方便AJAX传输 * * @param src * @return */ public static String escape(String src) { if (src == null) return src; int i; char j; StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length() * 6); for (i = 0; i < src.length(); i++) { j = src.charAt(i); if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j)) tmp.append(j); else if (j < 256) { tmp.append("%"); if (j < 16) tmp.append("0"); tmp.append(Integer.toString(j, 16)); } else { tmp.append("%u"); tmp.append(Integer.toString(j, 16)); } } return tmp.toString(); } /** * 把SRC解出正常编码 * * @param src * @return */ public static String unescape(String src) { if (src == null) return src; StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length()); int lastPos = 0, pos = 0; char ch; while (lastPos < src.length()) { pos = src.indexOf("%", lastPos); if (pos == lastPos) { if (src.charAt(pos + 1) == 'u') { ch = (char) Integer.parseInt( src.substring(pos + 2, pos + 6), 16); tmp.append(ch); lastPos = pos + 6; } else { ch = (char) Integer.parseInt( src.substring(pos + 1, pos + 3), 16); tmp.append(ch); lastPos = pos + 3; } } else { if (pos == -1) { tmp.append(src.substring(lastPos)); lastPos = src.length(); } else { tmp.append(src.substring(lastPos, pos)); lastPos = pos; } } } return tmp.toString(); } /** * 前台解码 * * @param src * @return */ public static String decodeURIComponent(String src) { if (src == null) return src; String ret = null; try { ret = URLDecoder.decode(src, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ret; } /** * 双重编码 * * @param data * @return */ public static String dbEncode(String data) { if (data == null) return null; return CodeUtil.escape(CodeUtil.encodeURIComponent(data)); } /** * 双重解码 * * @param data * @return */ public static String dbDecode(String data) { if (data == null) return null; return CodeUtil.decodeURIComponent(CodeUtil.unescape(data)); } /** * 前台编码 * * @param src * @return */ public static String encodeURIComponent(String src) { if (src == null) return src; String ret = null; try { ret = URLEncoder.encode(src, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ret; } /** * HTML转为TEXT * * @param str * @return */ public static String toText(String str) { if (str == null) { return ""; } else { str = str.replaceAll("<", "<"); str = str.replaceAll(">", ">"); str = str.replaceAll("'", "''"); str = str.replaceAll(" ", " "); str = str.replaceAll("\n", "
"); str = str.replaceAll("\"", """); } return str; } /** * TEXT转为HTML * * @param str * @return */ public static String toHtml(String str) { if (str == null) { return ""; } else { str = str.replaceAll("<", "<"); str = str.replaceAll(">", ">"); str = str.replaceAll("''", "'"); str = str.replaceAll(" ", " "); str = str.replaceAll("
", "\n"); str = str.replaceAll(""", "\""); } return str; } private static final char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; private static char toHex(int nibble) { return hexDigit[(nibble & 0xF)]; } /** * 将字符串编码成 Unicode 。 * * @param theString 待转换成Unicode编码的字符串。 * @param escapeSpace 是否忽略空格。 * @return 返回转换后Unicode编码的字符串。 */ public static String toUnicode(String theString, boolean escapeSpace) { int len = theString.length(); int bufLen = len * 2; if (bufLen < 0) { bufLen = Integer.MAX_VALUE; } StringBuffer outBuffer = new StringBuffer(bufLen); for (int x = 0; x < len; x++) { char aChar = theString.charAt(x); // Handle common case first, selecting largest block that // avoids the specials below if ((aChar > 61) && (aChar < 127)) { if (aChar == '\\') { outBuffer.append('\\'); outBuffer.append('\\'); continue; } outBuffer.append(aChar); continue; } switch (aChar) { case ' ': if (x == 0 || escapeSpace) outBuffer.append('\\'); outBuffer.append(' '); break; case '\t': outBuffer.append('\\'); outBuffer.append('t'); break; case '\n': outBuffer.append('\\'); outBuffer.append('n'); break; case '\r': outBuffer.append('\\'); outBuffer.append('r'); break; case '\f': outBuffer.append('\\'); outBuffer.append('f'); break; case '=': // Fall through case ':': // Fall through case '#': // Fall through case '!': outBuffer.append('\\'); outBuffer.append(aChar); break; default: if ((aChar < 0x0020) || (aChar > 0x007e)) { outBuffer.append('\\'); outBuffer.append('u'); outBuffer.append(toHex((aChar >> 12) & 0xF)); outBuffer.append(toHex((aChar >> 8) & 0xF)); outBuffer.append(toHex((aChar >> 4) & 0xF)); outBuffer.append(toHex(aChar & 0xF)); } else { outBuffer.append(aChar); } } } return outBuffer.toString(); } /** * 从 Unicode 码转换成编码前的特殊字符串。 * * @param in Unicode编码的字符数组。 * @param off 转换的起始偏移量。 * @param len 转换的字符长度。 * @param convtBuf 转换的缓存字符数组。 * @return 完成转换,返回编码前的特殊字符串。 */ public String fromUnicode(char[] in, int off, int len, char[] convtBuf) { if (convtBuf.length < len) { int newLen = len * 2; if (newLen < 0) { newLen = Integer.MAX_VALUE; } convtBuf = new char[newLen]; } char aChar; char[] out = convtBuf; int outLen = 0; int end = off + len; while (off < end) { aChar = in[off++]; if (aChar == '\\') { aChar = in[off++]; if (aChar == 'u') { // Read the xxxx int value = 0; for (int i = 0; i < 4; i++) { aChar = in[off++]; switch (aChar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': value = (value << 4) + aChar - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + 10 + aChar - 'a'; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': value = (value << 4) + 10 + aChar - 'A'; break; default: throw new IllegalArgumentException( "Malformed \\uxxxx encoding."); } } out[outLen++] = (char) value; } else { if (aChar == 't') { aChar = '\t'; } else if (aChar == 'r') { aChar = '\r'; } else if (aChar == 'n') { aChar = '\n'; } else if (aChar == 'f') { aChar = '\f'; } out[outLen++] = aChar; } } else { out[outLen++] = (char) aChar; } } return new String(out, 0, outLen); } }