unicode字符串转换

需求:把一个字符串中\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=
 */
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值