亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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()。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久在线观看| 日韩不卡在线观看| 亚洲国产免费av| 国产欧美一区二区三区久久人妖| 久久久久久久久久久久av| 精品精品国产国产自在线| 亚洲精品aⅴ中文字幕乱码| 国产97在线视频| 国产精品爽黄69天堂a| 国产精品人成电影| 日韩在线免费av| 欧美午夜无遮挡| 国外成人在线直播| 欧美第一页在线| 国产亚洲精品综合一区91| 日韩av成人在线观看| 黄色成人av在线| 超碰精品一区二区三区乱码| 亚洲精品97久久| 日本不卡高字幕在线2019| 欧美亚洲伦理www| 日韩国产精品视频| 久久久精品中文字幕| 亚洲第一免费网站| 国产成人亚洲综合青青| 国产精品欧美日韩一区二区| 久久69精品久久久久久久电影好| 自拍偷拍亚洲欧美| 国产一区二区精品丝袜| 中文字幕一区二区三区电影| 视频在线一区二区| 91精品在线国产| 在线性视频日韩欧美| 中文字幕无线精品亚洲乱码一区| 久热精品视频在线观看| 亚洲男人天堂2019| 97国产精品视频人人做人人爱| 91九色视频在线| 亚洲欧美日韩在线高清直播| 国产精品mp4| 国产精品亚洲激情| 亚洲视频在线观看网站| 国产69精品久久久久9999| 午夜精品一区二区三区在线视| 亚洲一区二区三区777| 久久精品国产亚洲一区二区| 欧美性视频网站| 日韩综合中文字幕| 国产日韩欧美日韩| 日韩在线欧美在线| 久久久国产视频| 日本午夜精品理论片a级appf发布| 久久久999精品| 日韩成人黄色av| 国产精品一区二区久久久久| 欧美大片网站在线观看| 亚洲精品视频二区| 欧美超级免费视 在线| 亚洲色图欧美制服丝袜另类第一页| 亚洲福利在线观看| 国产精品免费观看在线| 国产黑人绿帽在线第一区| 欧美成人午夜激情在线| 久久精品亚洲精品| 日韩在线观看av| 亚洲成人aaa| 日韩午夜在线视频| 欧美激情亚洲自拍| 国产精品白丝av嫩草影院| 日韩一区二区欧美| 91av在线免费观看视频| 91高清在线免费观看| 久久久久亚洲精品国产| 97超级碰在线看视频免费在线看| 最近2019年好看中文字幕视频| 色樱桃影院亚洲精品影院| 久久亚洲精品一区二区| 色黄久久久久久| 国内精品伊人久久| 久久久亚洲影院| 久久综合久久88| 欧美国产日韩免费| 中文字幕日韩av综合精品| 久久久久久久国产| 日韩成人久久久| 国产精品久久久久国产a级| 欧美色道久久88综合亚洲精品| 亚洲天堂av在线播放| 欧美成人精品在线视频| 国产精品www网站| 国产成人精彩在线视频九色| 蜜月aⅴ免费一区二区三区| 亚洲情综合五月天| 亚洲综合社区网| 日韩免费av片在线观看| 亚州欧美日韩中文视频| 久久久久久久久久av| 亚洲欧美日韩精品久久亚洲区| 欧美日韩中文字幕日韩欧美| 中文字幕亚洲一区| 国产伊人精品在线| 2020久久国产精品| 国产精品女视频| 国产婷婷色综合av蜜臀av| 国产主播在线一区| 午夜精品久久久久久久99黑人| 国产ts人妖一区二区三区| 亚州精品天堂中文字幕| 久久久av亚洲男天堂| 欧美视频国产精品| 久久久女女女女999久久| 国产视频欧美视频| 亚洲精品久久久久久久久久久久| 欧美天天综合色影久久精品| 亚洲护士老师的毛茸茸最新章节| 97香蕉超级碰碰久久免费的优势| 精品国产一区二区三区四区在线观看| 日产日韩在线亚洲欧美| 91a在线视频| 亚洲欧美综合区自拍另类| 久久久午夜视频| 欧美日韩免费观看中文| 亚洲精品一区二区网址| 91亚洲国产精品| 日韩av在线高清| 色av吧综合网| 成人免费网站在线| 欧美放荡办公室videos4k| 国产日韩精品在线| 久久久久久久久久av| 国产91色在线| 国产精品亚洲一区二区三区| 亚洲国产精品久久精品怡红院| 欧美疯狂性受xxxxx另类| 日韩亚洲精品视频| 欧美成年人在线观看| 成人妇女免费播放久久久| 久久人人爽国产| 亚洲一区第一页| 国产亚洲精品高潮| 亚洲精品99久久久久| 中文字幕精品影院| 久久国产一区二区三区| 欧美视频第一页| 91在线国产电影| 欧美三级免费观看| 亚洲自拍偷拍区| 日韩久久午夜影院| 久久久久国产精品一区| 日韩av在线免费看| 欧美黑人一区二区三区| 亲子乱一区二区三区电影| 欧美丰满少妇xxxxx做受| 成人激情在线观看| 亚洲欧美制服丝袜| 欧美洲成人男女午夜视频| 久久中文精品视频| 精品国产乱码久久久久久婷婷| 欧美激情精品久久久久久免费印度| 亚洲成年网站在线观看| 亚洲第一中文字幕在线观看| 国产玖玖精品视频| 国产精品极品美女在线观看免费| 欧美激情三级免费|