处理Unicode字符 \u202E 问题

这么一段字符串,实际内容应该是123abc456,在获取到的时候就变成下面的内容,确定要处理呀.... 又得手撸了代码了
\u202E : 会将字符串进行翻转,
\u202D : 会将字符串互换位置,但为何从123后面开始互换位置暂时还不知道,
测试得出,\u202D 会比 \u202E 先执行,也不能说先执行,顺序靠前吧,应该是ABCDE....这样排序的。

String a = "123\u202E654\u202Dabc";

逻辑就是我先分红三段,a = 123,b = \u202E654,c = \u202Dabc,
而后去掉b中的 \u202E,翻转b的顺序,
去掉c的 \u202D 
a + c + b 就是最后得出的正常字符,下面示例是处理多个这种字符的,就是加了一个递归
/**
 * @Author : Yanqiang
 * @Date : 2019-11-13
 * @Return : String
 * @Description : 处理微信昵称Unicode字符问题
 */
public static String cutString(String a) {
    //判读字符串不为null
    if (a != null && !a.equals("")) {
        //若是包含这两个特殊字符就处理,不包含直接return
        if (a.contains("\u202E") || a.contains("\u202D")) {
            int firstIndex = a.indexOf("\u202E");
            int lastIndex = a.indexOf("\u202D");
            //取第一段 -->[123]
            String first = a.substring(0, firstIndex);
            //取从第一次出现 [\u202D] 到 最后 --> [\u202Dabc\u202E456\u202Dabc]
            String last = a.substring(lastIndex);
            //取第一次出现 [\u202E] 到 [\u202D] 之间的值 --> [\u202E456]
            String middle = a.substring(firstIndex, lastIndex);
            //下面两步是把开头的Unicode字符去掉
            middle = middle.substring(1);
            last = last.substring(1);
            //翻转中间的字符串
            middle = new StringBuffer(middle).reverse().toString();
            //拼接成完整的字符串
            a = first + last + middle;
            if (a.contains("\u202E") || a.contains("\u202D")) {
                //刚才last的最后还可能有特殊字符,若是还有就递归
                return cutString(a);
            }
        }
    }
    return a;
}
相关文章
相关标签/搜索