麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

Java反轉字符串和相關字符編碼的問題解決

2019-11-26 16:04:34
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

public String reverse(char[] value){
       for (int i = (value.length - 1) >> 1; i >= 0; i--){
           char temp = value[i];
           value[i] = value[value.length - 1 - i];
           value[value.length - 1 - i] = temp;
       }
       return new String(value);
}

這樣的代碼,在算法方面是沒有任何問題的。但是今天在查看StringBuffer源代碼的時候發現,其中reverse方法的源代碼寫的很精妙。源代碼如下:

復制代碼 代碼如下:

public AbstractStringBuilder reverse() {
    boolean hasSurrogate = false;
    int n = count - 1;
    for (int j = (n-1) >> 1; j >= 0; --j) {
        char temp = value[j];
        char temp2 = value[n - j];
        if (!hasSurrogate) {
       hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE)
           || (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);
         }
         value[j] = temp2;
         value[n - j] = temp;
     }
     if (hasSurrogate) {
         // Reverse back all valid surrogate pairs
          for (int i = 0; i < count - 1; i++) {
             char c2 = value[i];
             if (Character.isLowSurrogate(c2)) {
                 char c1 = value[i + 1];
                 if (Character.isHighSurrogate(c1)) {
                 value[i++] = c1;
                 value[i] = c2;
             }
         }
         }
     }
     return this;
 }

這個方法是定義在StringBuffer的父類AbstractStringBuilder中的,所以該方法的返回值是AbstractStringBuilder,在子類中調用的方式如下:
復制代碼 代碼如下:

public synchronized StringBuffer reverse() {
    super.reverse();
    return this;
}

從方法的內容來看,源代碼中的基本思路是一致的,同樣采用遍歷一半字符串,然后將每個字符與其對應的字符進行交換。但是有不同之處,就是要判斷每個字符是否在Character.MIN_SURROGATE(/ud800)和Character.MAX_SURROGATE(/udfff)之間。如果發現整個字符串中含有這種情況,則再次從頭至尾遍歷一次,同時判斷value[i]是否滿足Character.isLowSurrogate(),如果滿足的情況下,繼續判斷value[i+1]是否滿足Character.isHighSurrogate(),如果也滿足這種情況,則將第i位和第i+1位的字符互換??赡苡械娜藭苫螅瑸槭裁匆@么做,因為Java中的字符已經采用Unicode代碼,每個字符可以放下一個漢字。為什么還要這么做?
一個完整的 Unicode 字符叫代碼點CodePoint,而一個 Java char 叫 代碼單元 code unit。String 對象以UTF-16保存 Unicode 字符,需要用2個字符表示一個超大字符集的漢字,這這種表示方式稱之為 Surrogate,第一個字符叫 Surrogate High,第二個就是 Surrogate Low。具體需要注意的事宜如下:
判斷一個char是否是Surrogate區的字符,用Character的 isHighSurrogate()/isLowSurrogate()方法即可判斷。從兩個Surrogate High/Low 字符,返回一個完整的 Unicode CodePoint 用 Character.toCodePoint()/codePointAt()方法。
  一個Code Point,可能需要一個也可能需要兩個char表示,因此不能直接使用 CharSequence.length()方法直接返回一個字符串到底有多少個漢字,而需要用String.codePointCount()/Character.codePointCount()。
 要定位字符串中的第N個字符,不能直接將N作為偏移量,而需要從字符串頭部依次遍歷得到,需要用String/Character.offsetByCodePoints() 方法。
從字符串的當前字符,找到上一個字符,也不能直接用offset-- 實現,而需要用 String.codePointBefore()/Character.codePointBefore(),或用 String/Character.offsetByCodePoints()
 從當前字符,找下一個字符,不能直接用 offset++實現,需要判斷當前 CodePoint的長度后,再計算得到,或用String/Character.offsetByCodePoints()。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: sese在线视频| 99sesese| 免费在线性爱视频 | 国产99久久久国产精品下药 | 日本中文视频 | xxxxhd73国产 | 九九热九九爱 | 欧产日产国产精品99 | 成人免费久久网 | av电影在线观看网站 | 久久99精品视频在线观看 | 在线成人免费视频 | 亚洲码无人客一区二区三区 | 美女黄网站免费观看 | 极品美女一级毛片 | 欧美亚洲国产一区 | 久久亚洲激情 | 免费a级黄色片 | 中午字幕无线码一区2020 | 黄色特级| 鲁丝片一区二区三区免费入口 | 免费观看一区二区三区 | 成av人在线观看 | 91精品免费在线 | 久久精品久久久久 | 成人三级在线播放 | 欧美一级黄色影院 | chinese军人gay呻吟| 日韩欧美电影在线观看 | 欧洲成人一区 | 国产精品999在线 | 免费毛片电影 | 国产午夜精品在线 | 国产免费永久在线观看 | 国产超碰人人做人人爱 | 亚洲精品久久久久久下一站 | 亚洲一区在线观看视频 | 久久国产中文 | 日韩视频一区二区在线观看 | 黄色1级视频 | 黄色视频a级毛片 |