这么一段字符串,实际内容应该是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; }