<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    飛翔的起點

    從這里出發

    導航

    <2008年9月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    統計

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    怎么得到ucs2字符串中制定位數

     Web應用程序在瀏覽器中顯示字符串時,由于顯示長度的限制,常常需要將字符串截取后再進行顯示。但目前很多流行的語言,如C#Java內部采用的都是 Unicode 16(UCS2)編碼,在這種編碼中所有的字符都是兩個字符,因此,如果要截取的字符串是中、英文、數字混合的,就會產生問題,如下面的字符串:

    String s = "a加b等于c,如果a等1、b等于2,那么c等3";

        上面的字符串既有漢字,又有英文字符和數字。如果要截取前6個字節的字符,應該是”a加b等",但如果用substring方法截取前6個字符就成了"a 加b等于c"。產生這個問題的原因是將substring方法將雙字節的漢字當成一個字節的字符(UCS2字符)處理了。要解決這個問題的方法是首先得到該字符串的UCS2編碼的字節數組,如下面的代碼如下:

    byte[] bytes = s.getBytes("Unicode");

        由于上面生成的字節數組中前兩個字節是標志位,bytes[0] = -2,bytes[1] = -1,因此,要從第三個字節開始掃描,對于一個英文或數字字符,UCS2編碼的第二個字節是相應的ASCII,第一個字節是0,如a的UCS2編碼是0  97,而漢字兩個字節都不為0,因此,可以利于UCS2編碼的這個規則來計算實際的字節數,該方法的實現代碼如下:

        public static String bSubstring(String s, int length) throws Exception
        {

            
    byte[] bytes = s.getBytes("Unicode");
            
    int n = 0// 表示當前的字節數
            int i = 2// 要截取的字節數,從第3個字節開始
            for (; i < bytes.length && n < length; i++)
            {
                
    // 奇數位置,如3、5、7等,為UCS2編碼中兩個字節的第二個字節
                if (i % 2 == 1)
                {
                    n
    ++// 在UCS2第二個字節時n加1
                }
                
    else
                {
                    
    // 當UCS2編碼的第一個字節不等于0時,該UCS2字符為漢字,一個漢字算兩個字節
                    if (bytes[i] != 0)
                    {
                        n
    ++;
                    }
                }
            }
            
    // 如果i為奇數時,處理成偶數
            if (i % 2 == 1)

            {
                
    // 該UCS2字符是漢字時,去掉這個截一半的漢字
                if (bytes[i - 1] != 0)
                    i 
    = i - 1;
                
    // 該UCS2字符是字母或數字,則保留該字符
                else
                    i 
    = i + 1;
            }

            
    return new String(bytes, 0, i, "Unicode");
        }

        下面代碼使用了bSubstring方法:

    String s = "a加b等于c,如果a等1、b等于2,那么c等3";
    System.out.println(bSubstring(s,
    6));

        上面的代碼截取的字符串是"a加b等"

    posted on 2008-09-08 23:02 forgood 閱讀(320) 評論(0)  編輯  收藏 所屬分類: java

    主站蜘蛛池模板: 亚洲乱码国产乱码精华| 日韩亚洲Av人人夜夜澡人人爽| avtt天堂网手机版亚洲| 91人人区免费区人人| 亚洲免费视频网站| 99久久人妻精品免费二区| 亚洲AV成人无码久久精品老人| 污视频在线观看免费| 一个人看的www在线免费视频 | 国产午夜亚洲精品不卡免下载 | av无码久久久久不卡免费网站| 色噜噜综合亚洲av中文无码| 91人成网站色www免费下载| 亚洲小视频在线播放| 一二三四在线播放免费观看中文版视频| 狠狠色香婷婷久久亚洲精品| 免费萌白酱国产一区二区三区| 免费被黄网站在观看| 美女被暴羞羞免费视频| 中文字幕亚洲综合久久菠萝蜜| 野花香高清在线观看视频播放免费 | 免费大片在线观看网站| www永久免费视频| 亚洲Av熟妇高潮30p| 最近最新MV在线观看免费高清| 亚洲高清国产拍精品熟女| 亚洲精品国产精品国自产观看| 国色精品va在线观看免费视频| 亚洲高清无在码在线电影不卡| 免费国产成人高清在线观看网站| 亚洲国产精品无码专区在线观看| 久久综合国产乱子伦精品免费 | 成人a毛片视频免费看| 日韩亚洲人成在线综合日本| 69堂人成无码免费视频果冻传媒| 亚洲第一综合天堂另类专| 国产亚洲情侣一区二区无码AV| 4399好看日本在线电影免费| 理论片在线观看免费| 亚洲成熟xxxxx电影| 日韩在线天堂免费观看|