EncodingUtil 工具类,对中文进行编码解码,能解决中文乱码问题以及特殊字符处理问题
package com.tool.utils;
import org.apache.commons.lang.StringUtils;
/**
* 字符编码解码工具类【处理中文乱码】
* @author jspanjsp
*
*/
public class EncodingUtil {
//特殊字符编码(中文)
public static String encodeZhCN(String content){
if(StringUtils.isBlank(content)){
return "";
}
return encodeStr(escape(content));
}
//特殊字符解码(中文)
public static String decodeZhCN(String content){
if(StringUtils.isBlank(content)){
return "";
}
return unescape(decodeStr(content));
}
/*特殊字符解码
* + URL 中+号表示空格 %2B
* 空格 URL中的空格可以用+号或者编码 %20
* / 分隔目录和子目录 %2F
* ? 分隔实际的URL和参数 %3F
* % 指定特殊字符 %25
* # 表示书签 %23
* & URL 中指定的参数间的分隔符 %26
* = URL 中指定参数的值 %3D
*/
public static String decodeStr(String str) {
str = str.replaceAll("thanks", "%");
str = str.replaceAll("44F", "-");
str = str.replaceAll("%2B", "+");
str = str.replaceAll("%20", " ");
str = str.replaceAll("%3F", "?");
str = str.replaceAll("%23", "#");
str = str.replaceAll("%26", "&");
str = str.replaceAll("%3D", "=");
str = str.replaceAll("%2F", "/");
str = str.replaceAll("%RR", "\r");
str = str.replaceAll("%NN", "\n");
//str = str.replaceAll("%25", "%");
return str;
}
//特殊字符编码
public static String encodeStr(String str) {
str = str.replaceAll("-", "44F");
str = str.replaceAll("\n", "%NN");
str = str.replaceAll("\r", "%RR");
str = str.replaceAll("\\+", "%2B");
str = str.replaceAll(" ", "%20");
str = str.replaceAll("\\?", "%3F");
str = str.replaceAll("#", "%23");
str = str.replaceAll("&", "%26");
str = str.replaceAll("=", "%3D");
str = str.replaceAll("/", "%2F");
str = str.replaceAll("%", "thanks");
return str;
}
//字符串编码,能解决中文乱码问题
public static String escape(String 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();
}
//字符串解码,能解决中文乱码问题
public static String unescape(String src) {
if (src == null)
return null;
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 if (src.charAt(pos + 1) == ' '
|| src.charAt(pos + 1) == ';') {
tmp.append(src.substring(pos, pos + 1));
lastPos = pos + 1;
} 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();
}
}