處理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;
}
相關文章
相關標籤/搜索