需求:把一个字符串中\uFFFF的字串变为字符串。
因为网上找了很多转换,一般都是正则匹配,然后转换,但是经常是会报错,都不能很完美的解决。所以自己谢了一个转换.
/**
* 把含义\uFFFF 的十六进制字符串转换为字符串
*/
public class UnicodeUtils {
/**
* 判断字符是否在[0-9|a-f]
* @param c 传入字符
* @return
*/
public static boolean isHex(char c){
char m=Character.toLowerCase(c);
return Character.isDigit(m) | m >= 'a' |m <='f';
}
/**
* 把含义\uFFFF的十六进制字符串解析为字符串
* @param unicode 还有\uFFFF 的字符串
* @return 解析可见字符串
*/
public static String perse(String unicode) {
int cursor = 0; //字符串游标
StringBuilder result = new StringBuilder();
while (cursor < unicode.length()){
char nextChar = unicode.charAt(cursor); //获取字符
// 1、判断字符是否是'\',不是就添加到result,是-就继续判断
if (nextChar == '\\') {
cursor++;
if (cursor == unicode.length())
throw new IllegalArgumentException("character to be escaped is missing");
nextChar = unicode.charAt(cursor);
// 2.判断是否为'u',不是- result 添加 "\" nextChar;是-解析十六进制
if(nextChar == 'u'){
cursor++;
if (cursor == unicode.length())
throw new IllegalArgumentException("character to be escaped is missing");
// hex用来接受16进制
StringBuilder hex = new StringBuilder();
//3.解析16进制,最多接受4个16进制字符。
while (cursor < unicode.length()){
nextChar = unicode.charAt(cursor);
if(isHex(nextChar) && hex.length()< 4){
hex.append(nextChar);
cursor++;
}else{
break;
}
}
// 4.结果判断,16进制转换为字符
if(hex.length() !=0){
result.append((char)Integer.parseInt(hex.toString(), 16));
}else{
result.append('\\').append('u');
}
}else{
result.append('\\').append(nextChar);
cursor++;
}
}else {
result.append(nextChar);
cursor++;
}
}
return result.toString();
}
}
测试:
import org.junit.Test;
public class App {
@Test
public void test20() throws IOException {
String line="#\\u9875\\u9762\\u8df3\\u8f6c\\u540c\\u6b65\\u901a\\u77e5\\u9875\\u9762\\u8def\\u5f84(WAP\\u652f\\u4ed8\\u7528)http://${m.url}/NG/index.html#/ucenter/orderDetail?orderId=";
System.out.println(UnicodeUtils.perse(line));
}
}
/**
* 结果:
* #页面跳转同步通知页面路径(WAP支付用)http://${m.url}/NG/index.html#/ucenter/orderDetail?orderId=
*/