cn.zcltd.btg.sutil.unicode.UnicodeConverter Maven / Gradle / Ivy
package cn.zcltd.btg.sutil.unicode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Kit:Unicode
*/
public class UnicodeConverter {
public static final UnicodeConverter me = new UnicodeConverter();
/**
* unicode编码
*
* @param jsonStr 待编码json字符串
* @return 编码后json字符串
*/
public String encrypt(String jsonStr) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < jsonStr.length(); i++) {
char c = jsonStr.charAt(i); // 取出每个字符
//处理忽略的字符
if (isPass(c)) {
sb.append(String.valueOf(c));
continue;
}
//补位处理
String cStr = Integer.toHexString(c);//转为16进制表示
switch (4 - cStr.length()) {
case 0:
sb.append("\\u").append(cStr);
break;
case 1:
sb.append("\\u0").append(cStr);
break;
case 2:
sb.append("\\u00").append(cStr);
break;
case 3:
sb.append("\\u000").append(cStr);
break;
default:
sb.append(String.valueOf(c));
break;
}
}
return sb.toString();
}
private final Pattern REG_UNICODE = Pattern.compile("[0-9A-Fa-f]{4}"); //unicode表示正则匹配
/**
* unicode解码
*
* @param unicodeJsonStr unicode编码的Json字符串
* @return 解码后的json字符串
*/
public String decrypt(String unicodeJsonStr) {
StringBuilder sb = new StringBuilder();
int len = unicodeJsonStr.length();
for (int i = 0; i < len; i++) {
char c1 = unicodeJsonStr.charAt(i);//取出字符
if (c1 == '\\' && i < len - 1) {//获取到unicode标识\并不在末尾
char c2 = unicodeJsonStr.charAt(++i);//取出unicode标识下一位字符
if (c2 == 'u' && i <= len - 5) {//获取到unicode十六进制标识u并最后一段能组成完整unicode格式
String tmp = unicodeJsonStr.substring(i + 1, i + 5); //取出unicode格式\\uxxxx中的十六进制xxxx
Matcher matcher = REG_UNICODE.matcher(tmp);//进行unicode四位十六进制正则匹配
if (matcher.find()) {//匹配成功
sb.append((char) Integer.parseInt(tmp, 16));//将十六进制转换为字符添加到结果
i = i + 4;//处理下一个
} else {//未匹配成功,直接将原始字符添加到结果
sb.append(c1).append(c2);
}
} else {
sb.append(c1).append(c2);//未获取到unicode十六进制标识u或最后一段不能组成完整unicode格式,直接将原始字符添加到结果
}
} else {
sb.append(c1);//未获取到unicode标识\或在末尾
}
}
return sb.toString();
}
/**
* 是否忽略
*
* @param c 当前处理的字符
* @return 忽略返回true,否则返回false
*/
public boolean isPass(char c) {
return false;
}
}